本题虽然考察的知识点很简单,但是想要程序在规定时间内跑完并且正确的话,就必须舍弃冒泡排序、选择排序和插入排序这三种较为低级的排序算法。
八大排序中还剩下很多可以用的算法,例如:希尔排序、快速排序、堆排序、基数排序、归并排序。
由于基数排序可能会导致内存超标(没测试过),而且写起来比较麻烦,所以我们选择听的比较多的,也是经常会遇到的面试题:快速排序。
快速排序
总得来说,快速排序的介绍非常简单。
首先,我们选择一个枢轴,一般为数组的第一个值或最后一个值
让所有左边的值都小于这个枢轴
让所有右边的值都大于这个枢轴
递归排左右两边
递归终止的条件为:left == right
具体上代码:import java.util.*; public static void quickSort(int[] arr,int left,int right) { if ( left < right) { //只有当left < right的时候,排序才有意义 int i = left;//辅助左指针 int j = right;//辅助右 int pivot = arr[i]; // 枢轴,将所有小于pivot的数放在它左边,所有大于pivot的数放在它右边 while (i < j) { //当 i == j 时,循环才结束 while (i < j && arr[j] >= pivot) { //从后往前找,找到比pivot小的数,或者 i == j j--; } if (i < j) {//如果退出上个循环后,i仍小于j,说明,找到了符合条件的数 arr[i] = arr[j]; //令i位置上的数等于j位置上的数 //由于交换数据太耗费时间,所以用这种方法代替 //最开始的i位置上的数已经通过pivot保存起来,此时为无效数据,可以用来保存j上的数据 //而赋值完成后,j上的数据为无效数据,在下一个循环中会被修改 } while(i < j && arr[i] <= pivot) { //此时再从前往后找,找到比pivot大的数,或者 i == j i++; } if (i < j) { //此时代表找到了这么个数,可以进行赋值 arr[j] = arr[i]; } } //当循环退出后,i == j,此时i,j在同一位置,且为无效数据 //修改该位置的数据为pivot,并利用递归完成其余两部分数据的排序 arr[i] = pivot; quickSort(arr,left, i - 1);//从中间位置往左 quickSort(arr,i + 1,right);//从中间位置往右 } }
需要注意的是:函数开始的时候,Left = 0, right = arr.length - 1