快速排序应该是排序算法里面经典里的经典了,在上两周美图手机的现场笔试中有一道编程题居然是现场默写排序算法(当然我那时全忘了,毕竟我平时最常用的排序算法是java里面的Arrays.sort())。
快速排序的原理也很简单,但是让你自己想的话比较难想,如果你初次接触到分治思想没准你还会觉得有点难懂,原理我也不多说。
概括来就是在分治的过程中,每次以最后一个元素为基准,两个index指向头端和尾端,然后前段index右移找寻比基准大的数,后端index左移找寻比基准小的数,都找到后就开始开始交换两个数,直到左右两个index相遇。这样一轮下来,在最后相遇的地点,左边的都是比基准小的数,毕竟比基准大的都换到右边去了,右边同理。然后把基准换到相遇的地点,然后分治思想对左边的细换。
一定要自己在纸上模拟!一定要自己在纸上模拟!一定要自己在纸上模拟!重要的事情说三遍。
接下来是代码实现:
public static void kuaisu(int start, int end){
if(end <= start) return;
int pivot = partition(start, end);
kuaisu(start, pivot - 1);
kuaisu(pivot + 1, end);
}
这个主要体现的就是分治思想啦,pivot变量代表的就是相遇的地点啦。
private static int partition(int start, int end) {
int i = start - 1, j = end;
int number = array[end];
while(true) {
while(array[++i] < number);
while(number < array[--j])
if(j == i) break;
if(i >= j) break;
exchange(i, j);
}
exchange(i, end);
return i;
}
本算法的核心就是这个partition方法,记得用纸模拟哦,模拟两边就会了,我也不多说,说再多不如自己手写来的深刻。
总结:在快速排序中最重要的是理解partition这个思路和分治思想方法,如果都懂了其实快排自己也能写。(为什么我两周前的笔试没写出来?因为两周前的我根本没复习两年前教的东西。)有些同学可能把我的东西复制过去后会有点问题。嗯,自己也要动手写点东西啦,比如说要排序的数组我可是设为全局变量的哦,exchange函数也是一个很容易就实现的东西啦,就是交换数组中的两个元素。