与快速排序算法C#混淆

时间:2016-12-03 15:18:58

标签: c# quicksort

我一直在研究如何在C#中为大学做快速排序。我几乎让它工作了。只有少数数字没有按照正确的顺序出现。 阵列:1,5,8,6,7,3,2,4,9 "排序"成:1,5,4,6,2,3,7,8,9 而不是1,2,3,4,5,6,7,8,9。 不知道我的代码中哪里出错:

int[] array4 = { 1, 5, 8, 6, 7, 3, 2, 4, 9};
QuickSort quick = new QuickSort();
quick.Quicksort(array4, 0, array4.Length - 1);

public void Quicksort(int[] array, int left, int right)
{
        int pivot, temp;                      
        pivot = array[(left + right / 2)];
        do
        {
            while ((array[left] < pivot) && (left < right))
                left++;

            while ((pivot < array[right]) && (right > left))
                right--;
            if (left <= right)
            {
                temp = array[left];
                array[left] = array[right];
                array[right] = temp;
                left++;
                right--;
            }
        }
        while (left <= right);

        if (left < right) Quicksort(array, left, right);              
        }            
 }

由于

1 个答案:

答案 0 :(得分:0)

在你的Quicksort方法中,正如Lee的评论指出的那样,你没有使用分区/枢轴的左右部分调用quicksort方法。

首先,我确信你没有得到适当的支点:

pivot = array[(left + right / 2)];

上面,除法将首先发生,因此它将“右”除以2然后加到“左”。这将给你错误的支点。它应该是:

pivot = array[(left + right) / 2];

其次,当您输入Quicksort方法时,您将获得STARTING索引值(左/右),并使用这些变量获取下一个轴。当您更改它们时,这将抛弃“左”和“右”STARTING索引。因此,您需要复制这些STARTING值并使用复制的值创建下一个分区/数据透视。

以下是我对您的代码所做的更改,它似乎正常运行。

public static void Quicksort(int[] array, int left, int right)
{
  int pivot, temp;
  pivot = array[(left + right) / 2];
  int originalLeft = left;
  int originalRight = right;
  do
  {
    while (array[left] < pivot)
      left++;

    while (pivot < array[right])
      right--;
    if (left <= right)
    {
      temp = array[left];
      array[left] = array[right];
      array[right] = temp;
      left++;
      right--;
    }
  }
  while (left <= right);

  // note that the original left and right values are needed here
  if (originalLeft < right)
    Quicksort(array, originalLeft, right);
  if (left < originalRight)
    Quicksort(array, left, originalRight);
}

希望这有帮助。