2

这是3路快速排序...

private void quicksort3(int[] input, int low, int high)
{
    int i = low - 1, j = high, left = low - 1, right = high, pivot = input[high], k;

    if (high <= low) return;
    while (true)
    {
        while (input[++i] < pivot) ;
        while (pivot < input[--j])
            if (j == low) break;
        if (i >= j) break;
        swap(input, i, j);
        if (input[i] == pivot) 
        {
            left++; 
            swap(input, left, i); 
        }
        if (pivot == input[j]) {
            right--;
            swap(input, j, right);
        }
    }
    swap(input, i, high); j = i - 1; i++;
    for (k = low; k < left; k++, j--) 
        swap(input, k, j);
    for (k = high - 1; k > right; k--, i++) 
        swap(input, i, k);
    quicksort3(input, low, j);
    quicksort3(input, i, high);
}

对于输入9 5 3,我得到异常错误Index was outside the bounds of the array.,此处发生异常,pivot = input[high]其中 high 的值为 -1(所以我明白为什么我有错误)但是我该如何解决呢?

我这样调用函数quicksort3(arr,0,arr.Length-1);

4

4 回答 4

3

但我该如何解决呢?

通过在达到此边缘条件时提前退出。

 //int i = low - 1, j = high, left = low - 1, right = high, pivot = input[high], k;
 //if (high <= low) return;

 if (high <= low) return;
 int i = low - 1, j = high, left = low - 1, right = high, pivot = input[high], k;
于 2012-12-02T17:47:56.310 回答
3

在检查边界条件之前执行您的赋值。所以你应该放在pivot = input[high]line 之后if (high <= low) return;

于 2012-12-02T17:50:02.743 回答
3

可能有点离题,但在Robert Sedgewick 和 Kevin Wayne 的“算法”一书中有很棒的 3 路快速排序,我只是喜欢这段代码,它非常简单,而且它确实符合它的意图。
你可以在这里看到它 - Quick3way.java

private static void sort(Comparable[] a, int lo, int hi) { 
    if (hi <= lo) return;
    int lt = lo, gt = hi;
    Comparable v = a[lo];
    int i = lo;
    while (i <= gt) {
        int cmp = a[i].compareTo(v);
        if      (cmp < 0) exch(a, lt++, i++);
        else if (cmp > 0) exch(a, i, gt--);
        else              i++;
    }

    sort(a, lo, lt-1);
    sort(a, gt+1, hi);
}
于 2012-12-02T17:59:12.823 回答
0

这应该有效:

 while(a[i++]<v); 
 while(a[j]>v) 
   j--; 

其余的还可以。

于 2013-05-04T13:07:55.743 回答