Quicksort有2路分区

时间:2015-05-13 13:41:20

标签: c# algorithm quicksort

我正在尝试按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,则继续处理并以正确的输出结束。

我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:1)

只需拨打电话

即可
var v = a[right];
行后

if (right <= left)
    return;