Sedgewick Quicksort没有完全意义

时间:2016-01-15 06:27:14

标签: java algorithm sorting quicksort

我理解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)部分

中发生的事情

1 个答案:

答案 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)是新分区