由于某种原因,当j低于i时,我的while循环(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;
}
答案 0 :(得分:0)
我打赌它的递归或其中一个内部while循环还在继续。我没有记住快速排序算法,但是如果你打破了调试器,你会发现自己处于两个内部while循环之一。
答案 1 :(得分:0)
编码快速排序是一项非常好的练习,它并不像想要让一切正常一样简单! ;)
这是您的代码存在的一个问题。考虑如果j
碰到枢轴会发生什么,而i
却没有。您将枢轴(j
)与i
处的值进行交换,并通过枢轴增加i
。这不能正确地继续(如果您了解Quicksort,您应该理解为什么)。
选择数据透视图后,我想将其与一个边界(left
或right
)进行交换,交换值直到i
和j
相遇,然后放入在这个地方回转。当然还有其他方法。
答案 2 :(得分:0)
这不是一个无限循环。
while (a[i] < x)
{
i++;
}
如果x是列表中的最大数字,它将引发“i”#只要数组超出范围,程序就会抛出OutOfRangeException。
答案 3 :(得分:0)
如果i==j
和 a[i]==x
会怎样?没有增量,没有减少,只需交换并继续......
考虑将while(i<=j)
更改为while(i<j)
。如果i==j
...