c# while循环不存在(快速排序)
本文关键字:快速排序 不存在 while 循环 | 更新日期: 2023-09-27 17:54:28
由于某些原因,当j小于i时,我的while循环for (i<=j)没有结束。
我观察了调试值,并反复看到I和j(分别)的值为(4,3),(6,5)等。
public static List<Item> QuickSort(List<Item> a, int left, int right)
{
int i = left;
int j = right;
double pivotValue = ((left + right) / 2);
Item x = a[Convert.ToInt32(pivotValue)];
Item w;
while (i <= j)
{
//these while loops continue looping after i<=j is false
while (a[i] < x)
{
i++;
}
while (x < a[j])
{
j--;
}
if (i <= j)
{
w = a[i];
a[i++] = a[j];
a[j--] = w;
}
}
if (left < j)
{
QuickSort(a, left, j);
}
if (i < right)
{
QuickSort(a, i, right);
}
return a;
}
我敢打赌,这要么是递归,要么是内部while循环中的一个,仍然在进行。我没有记住快速排序算法,但我敢打赌,如果你在调试器中出错,你会发现自己陷入了两个内部while循环中的一个。
编码快速排序是一个很好的练习,它并不像看起来那么容易让一切都正确!;)
你的代码有一个问题。考虑如果j
碰到主元,而i
没有碰到会发生什么。您将枢轴(在j
处)与i
处的值交换,并将i
增加到枢轴之上。这不能正确继续(如果你理解快速排序,你应该明白为什么)。
选择枢轴后,我喜欢用一个边界(left
或right
)交换它,去交换值,直到i
和j
相遇,然后把枢轴放回这个地方。当然,还有其他的方法。
这不是一个无限循环。
while (a[i] < x)
{
i++;
}
如果x是列表中最大的数字,只要数组超出范围,它就会引发'i',并且程序将抛出OutOfRangeException。
如果i==j
和 a[i]==x
…会发生什么?没有递增,没有递减,只是交换和继续…
考虑将while(i<=j)
更改为while(i<j)
。如果i==j
…