几个面试常见算法
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;
}