我一直在研究如何在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);
}
}
由于
答案 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);
}
希望这有帮助。