说起快速排序,很多人都能够写出一个正确的快速排序,但就快速排序的正确性,就无从探究了。为什么说写出来的快速排序就是正确的。在快速排序中间的关键几步,以什么样的数据组织来保障快速排序的正确性。本文以《数据结构与算法 Java语言描述》中所描述的快速排序来进行理解,以查看其中的正确性。
首先查看排序的整体伪代码:
public static void quicksort(int[] a, int left, int right) {
//第1步
if(left + CUTOFF > right) {
insertsort(a, left, right);
return;
}
//第2步
int pivot = med(a, left, right);
//第3步
int i = left, j = right - 1;
while(true) {
while(a[++i] < pivot)
;
while(a[--j] > pivot)
;
//第4步
if(i < j)
swap(a, i, j);
else
break;
}
//第5步
swap(a, i, right - 1);
//第6步
quicksort(a, left, i - 1);
quicksort(a, i + 1, right);
}
其中,中间所涉及的med算法如下所示:
private static int med(int[] a, int left, int right) {
int center = (left + right) / 2;
if(a[center] < a[left])
swap(a, left, center);
if(a[right] < a[left])
swap(a, left, right);
if(a[right] < a[center])
swap(a, center, right);
swap(a, center, right - 1);
return a[right - 1];
}
以上即整个快速排序算法以及相对应的获取pivot的算法。
那么我们首先从源码上分析整个排序算法的正确性,以及在特殊的控制点上是如何取得正确的(在后续的说明中 小于的意思为小于或等于 大于的意思为大于或等于,即不对=pivot的数进行特殊处理)。