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;
}

c# while循环不存在(快速排序)

我敢打赌,这要么是递归,要么是内部while循环中的一个,仍然在进行。我没有记住快速排序算法,但我敢打赌,如果你在调试器中出错,你会发现自己陷入了两个内部while循环中的一个。

编码快速排序是一个很好的练习,它并不像看起来那么容易让一切都正确!;)

你的代码有一个问题。考虑如果j碰到主元,而i没有碰到会发生什么。您将枢轴(在j处)与i处的值交换,并将i增加到枢轴之上。这不能正确继续(如果你理解快速排序,你应该明白为什么)。

选择枢轴后,我喜欢用一个边界(leftright)交换它,去交换值,直到ij相遇,然后把枢轴放回这个地方。当然,还有其他的方法。

这不是一个无限循环。

while (a[i] < x)
    {
        i++;
    }

如果x是列表中最大的数字,只要数组超出范围,它就会引发'i',并且程序将抛出OutOfRangeException。

如果i==j a[i]==x…会发生什么?没有递增,没有递减,只是交换和继续…

考虑将while(i<=j)更改为while(i<j)。如果i==j