说起快速排序,很多人都能够写出一个正确的快速排序,但就快速排序的正确性,就无从探究了。为什么说写出来的快速排序就是正确的。在快速排序中间的关键几步,以什么样的数据组织来保障快速排序的正确性。本文以《数据结构与算法 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的数进行特殊处理)。