几个面试常见算法

1、选择排序

基本思路:选择某个索引位置的元素,然后和后面元素依次比较,若大于则交换位置,经过第一轮比较排序后可得出最小值,然后使用同样的方法把剩下的元素逐个比较即可。

static void selectSort(int[] arry){
  for(int times = 0; times <arry.length - 1; times ++){
    int minIndex = times;
    for(int i = times + 1; i < arry.length; i ++){
      if(arry[i] < arry[minIndex]){
        minIndex = i;
      }
    }
    swap(arry,times,minIndex); // 每一轮结束后才调换位置
  }
}

2、冒泡排序

基本思路:对未排序的各元素从头到尾依次比较相邻的两个元素大小关系,若大于则交换位置,经过第一轮比较排序后可得出最大值,然后使用同样的方法把剩下的元素逐个比较即可。

static void bubbleSort(int[] arry){
  int temp = 0;
  for(int j = 0; j < arry.length -1; j++){
    for(int i = 1; i < arry.length -j; i++){
         if(arry[i-1] > arry[i]){
        temp = arry[i-1];
              arry[i-1] = arry[i];
              arry[i] = temp;
           }
        }
    }
}

3、二分查找

当数据量很大适宜采用该方法;采用二分法查找时,数据需是排好序的。为了更好的理解算法,下面用一个游戏来举例。

猜数游戏: 一个朋友让你猜他正在想的一个从1到100之间的数,等你猜了,他会告诉你三种结果中的一个:你猜的比他想的大,或小,或猜中了。 为了能用最少的次数猜中,必须从50开始猜。如果他说你猜的小了,那么就能推出哪个数在50到100之间,所以马上猜75。但如果他说猜大了,你也能明白哪个说在1到50之间,所以马上猜25。如此重复,范围越来越小,直到猜到为止。

static int binarySearch(int[] arry, int key){
  int low = 0;                        // 最低索引
  int high = arry.length;             // 最高索引
    while(low <= high){                 // 最低索引不能高于最高索引
      int mid = (low + high) >> 1;    // 中间索引
        if(arry[mid] < key)             // key值位于大值半区
          low = mid + 1;              // 将最低索引设置为中间索引+1
        else if(arry[mid] > key)        // key值位于小值半区
          high = mid - 1;             // 将最高索引设置为中间索引-1
        else
          return mid;
    }
    return -1;
}
原文地址:https://www.cnblogs.com/zoe15/p/5366224.html