0

我写了一个冒泡排序,但是,当我打印出数组时,它是排序的,但它以最大的数字开始,以最小的数字结束。

public int[] BubbleSort(int[] unsortedArray)
{
    for(int i = 0; i < unsortedArray.Length; i++)
        for(int j = 0; j < unsortedArray.Length; j++)
            if(unsortedArray[i] < unsortedArray[j])
            {
                int temp = unsortedArray[i];
                unsortedArray[i] = unsortedArray[j];
                unsortedArray[j] = temp;
            }
    return unsortedArray;
}

任何人都可以解释为什么列表被颠倒了。

编辑:对不起,粘贴了错误的代码。

当该行读取 if(unsortedArray[i] < unsortedArray[j]) 时,列表从低到高排序,但是,这在逻辑上没有意义。如果 i 小于 j,则交换它们。

4

4 回答 4

2

可能更好:

public int[] BubbleSort(int[] unsortedArray)
{
    return unsortedArray.OrderBy(x=>x).ToArray();
}

原始的一些问题,i并且j迭代太多,它仍然可以工作,但是它会进行不必要的迭代,不会影响结果,而且你的条件unsortedArray[i] < unsortedArray[j]是倒退的。

public int[] BubbleSort(int[] unsortedArray)
{
    for(int i = 0; i < unsortedArray.Length-1; i++)
        for(int j = i+1; j < unsortedArray.Length; j++)
            if(unsortedArray[i] > unsortedArray[j])
            {
                int temp = unsortedArray[i];
                unsortedArray[i] = unsortedArray[j];
                unsortedArray[j] = temp;
            }
    return unsortedArray;
}

优化冒泡排序:

public int[] BubbleSort(int[] unsortedArray)
{
    var n=unsortedArray.Length;
    while(n>0)
    {
        var newn=0;
        for(var i=1;i<=n-1;i++)
        {
            if(unsortedArray[i-1]>unsortedArray[i])
            {
                var temp = unsortedArray[i];
                unsortedArray[i] = unsortedArray[i-1];
                unsortedArray[i-1] = temp;
                newn=i;
            }
        }
        n=newn;
    }
}
于 2013-08-07T19:44:06.253 回答
1

这是有条件的

if(unsortedArray[i] < unsortedArray[j])

它应该是

if(unsortedArray[j] < unsortedArray[i])

编辑:回答您的编辑。

您希望在运行内部循环后元素 inunsortedArray[i]具有最低值。这意味着您只有在遇到 a 时才将其关闭unsortedArray[j],它小于当前值unsortedArray[i]

如果unsortedArray[i]已经是较低的值,则将其保留在原处。

于 2013-08-07T19:38:24.130 回答
0

你的比较

 if(unsortedArray[i] < unsortedArray[j])

应该

 if(unsortedArray[i] > unsortedArray[j])
于 2013-08-07T19:38:58.683 回答
0
int[] bd = new int[] { 25, 35, 104, 30, 89, 30, 42, 11, 8, 4, 55, 65, 98, 542, 2 };

for (int rnd = bd.Length; rnd > 0; rnd--)
{
    for (int i = bd.Length - 1 ; i >= 0;  i--)
    {
        if (i != 0)
        {
            if (bd[i - 1] < bd[i])
            {
                temp = bd[i];
                bd[i] = bd[i - 1];
                bd[i - 1] = temp;

            }
        }
    }
}

for (int j = 0; j <= bd.Length - 1; j++)
{
    Console.Write(bd[j] + Environment.NewLine);
}
于 2018-01-25T06:20:30.550 回答