我理解quicksort的概念,我见过的大部分实现对我来说都很有意义。然而罗伯特·塞奇威克(Robert Sedgewick)没有这样做,他的实施方式如下:
private void sort(int lo, int hi) {
if (hi <= lo) return;
int j = partition(lo, hi);
sort(lo, j-1);
sort(j+1, hi);
}
private int partition(int lo, int hi) {
int start = lo;
int partition = hi + 1;
int pivot = theArray[lo];
while (true) {
// left to right
while (less(theArray[++start], pivot))
if (start == hi) break;
// right to left
while (less(pivot, theArray[--partition]))
if (partition == lo) break;
// check if pointers cross
if (start >= partition) break;
exch(theArray, start, partition);
}
// place pivot at partition
exch(theArray, lo, partition);
return partition;
}
private boolean less(int v, int w) {
return v < w;
}
private void exch(int[] a, int i, int j) {
int swap = a[i];
a[i] = a[j];
a[j] = swap;
}
我了解除分区功能以外的所有内容。特别是在while(true)
部分
答案 0 :(得分:2)
让我们做一些大脑调试&#34;
(ul.menu>li*4>a[href="#"]{"one","two","three","four"})
将第一个元素修复为透视值
int pivot = theArray[lo];
找到交换的第一个元素 - 最左边的一个比枢轴
while (less(theArray[++start], pivot))
if (start == hi) break;
找到第二个交换元素 - 最右边的一个元素比枢轴
while (less(pivot, theArray[--partition]))
if (partition == lo) break;
当没有更多要交换的元素时,中断if (start >= partition) break;
循环
while (true)
交换元素
示例exch(theArray, start, partition);
:
5是枢轴
第一个&#39;坏&#39;元素是8
第二个是2
他们被交换了
[5 3 8 9 2]
现在第一个索引停在4(hi),第二个索引停在2,循环中断,5个与2交换。
结果:[5 3 2 9 8]
子范围(2,3,5)和(9,8)是新分区