3路Quicksort算法

时间:2012-12-02 17:23:46

标签: c# algorithm quicksort

这是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 个答案:

答案 0 :(得分: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;

答案 1 :(得分:3)

在检查边界条件之前执行您的值赋值。因此,您应该将pivot = input[high]放在第if (high <= low) return;行之后。

答案 2 :(得分:3)

可能有点偏离主题,但是在Robert Sedgewick and Kevin Wayne book "Algorithms"中有很好的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);
}

答案 3 :(得分:0)

这应该有效:

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

其余的都没问题。