C#while循环不退出(快速排序)

时间:2014-03-27 21:51:01

标签: c# loops while-loop quicksort

由于某种原因,当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;
}

4 个答案:

答案 0 :(得分:0)

我打赌它的递归或其中一个内部while循环还在继续。我没有记住快速排序算法,但是如果你打破了调试器,你会发现自己处于两个内部while循环之一。

答案 1 :(得分:0)

编码快速排序是一项非常好的练习,它并不像想要让一切正常一样简单! ;)

这是您的代码存在的一个问题。考虑如果j碰到枢轴会发生什么,而i却没有。您将枢轴(j)与i处的值进行交换,并通过枢轴增加i。这不能正确地继续(如果您了解Quicksort,您应该理解为什么)。

选择数据透视图后,我想将其与一个边界(leftright)进行交换,交换值直到ij相遇,然后放入在这个地方回转。当然还有其他方法。

答案 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 ...

,也无需交换