我正在尝试按quicksort
实施Sadgewick
算法。代码取自http://www.sorting-algorithms.com/static/QuicksortIsOptimal.pdf
这是书中的内容:
void quicksort(Item a[], int l, int r)
{
int i = l-1, j = r; Item v = a[r];
if (r <= l) return;
for (;;)
{
while (a[++i] < v) ;
while (v < a[--j]) if (j == l) break;
if (i >= j) break;
exch(a[i], a[j]);
}
exch(a[i], a[r]);
quicksort(a, l, i-1);
quicksort(a, i+1, r);
}
这是我在C#
中的实现:
static void QuickSort2Partitions(int[] a, int left, int right)
{
int i = left - 1, j = right;
var v = a[right];
if (right <= left)
return;
while(true)
{
while (a[++i] < v) ;
while(v < a[--j])
{
if (j == left)
break;
}
if (i >= j)
break;
var c1 = a[i];
a[i] = a[j];
a[j] = c1;
}
var c2 = a[i];
a[i] = a[right];
a[right] = c2;
QuickSort2Partitions(a, left, i - 1);
QuickSort2Partitions(a, i + 1, right);
}
我想把它称为:
var a = new int[10] { 9, 4, 5, 3, 1, 2, 8, 7, 6, 0 };
QuickSort2Partitions(a, 0, a.Length - 1);
但对于第一次递归调用,它将-1
作为right
传递,此代码抛出out of range exception
:
var v = a[right];
自right is -1
以来。如果我将调试更改为0
,则继续处理并以正确的输出结束。
我在这里错过了什么吗?
答案 0 :(得分:1)
只需拨打电话
即可var v = a[right];
行后
if (right <= left)
return;