前言的前言:
如果看不懂这些干巴巴的理论文字,那就先不用看了,下面代码中有详细的注释,大家可以先跟着代码走几遍,回过头来再看这些文字描述,总之:纸上得来终觉浅,绝知此事要躬行。前言:
排序算法哪家强,从实际应用的角度上将,快排表现很好。很自然地,人们会觉得短数组比长数组更好处理,因此可能会想到将原始数组分为若干各子部分然后分别进行排序。快速排序就是基于分治法的排序算法,这不过它更多地侧重于“分”,没有明显的“合”过程。
快速排序的要点:
1.快排算法的主要思想:
(1)从待排序序列S中“任意”选择一个记录k作为轴值(Pivot)。
(2)将剩余的记录分割(partition)成左子序列L和右子序列R。
(3)L中所有记录都小于或等于k,R中记录都大于等于k,因此k正好位于正确的位置。
(4)对子序列L和R递归进行快速排序,直到子序列中只含有0或1个元素,退出递归。
2.如何选择轴值pivot,这对快排的时间性能影响很大,轴值的选择应尽量使得序列可以据此划分为均匀的两半。
3.如何实现最关键的分割的过程:最简单的分割方法就是左指针l和右指针r(下标)分别从序列的左端、右端向序列中间扫描;左边越过那些小于等于pivot的值,停在第一个大于pivot的值Kl;右边越过那些大于等于pivot的值,停在第一个小于pivot的值Kr;交换逆置记录Kl和Kr;从交换后的位置,继续从左右向中间扫描,发现并交换逆置记录对,直到l、r交叉而整个序列扫描完毕。这种方法适用于需要处理l、r边界,轴值最后定位等情况。
4. 由于递归开销过大,所以当子序列足够短时,我们采用插入排序来完成对子序列的排序。
5. 快速排序之所以快是因为:它每次选定轴值pivot并进行划分子集(分割交换)后该轴值被一次性的放到了他最终该放到的位置。
下面以一趟分割交换为例:
下标 |
0 |
1 |
2 |
3 |
4 |
5 |