这是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);
答案 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--;
其余的都没问题。