为什么这种排序算法有效?

时间:2013-07-24 16:33:47

标签: algorithm sorting

我有以下算法来订购带有10个数字的.txt文件

for (int i=0;i<array.length;i++)
{
    for(int j=i;j<array.length;j++)
    {
        if (array[i]<array[j])
        {
            temp=array[i];
            array[i]=array[j];
            array[j]=temp;
        }
    }
}

它会按顺序写入一个包含所有数字的新.txt文件。但是用笔纸说它不应该起作用。它是以下内容:

7 10 4 3 5 8 1 3

算法应该这样做:

10 7 4 3 5 8 1 3
10 8 4 3 5 7 1 3
10 8 5 3 4 7 1 3
10 8 5 4 3 7 1 3
10 8 5 4 7 3 1 3
10 8 5 4 7 3 3 1

显然,最后一行不是有序的,为什么代码做得对?或者......当我用笔和纸做错时,我哪里错了?

3 个答案:

答案 0 :(得分:5)

为什么它不起作用?这是一个非常基本的排序算法(称为selection sort)。你的钢笔和铅笔的问题在于你忘记了外面的for。继续为每个项目排序。这就是它O(n^2)复杂性的原因。

答案 1 :(得分:0)

为什么它不起作用?对于每个位置i,内部循环有效地将列表其余部分的最大成员移动到该位置(使其成为选择排序)。

我认为你的论文演练在第三步出错了;我明白了:

7 10 4 3 5 8 1 3 <- original list
^i
10 7 4 3 5 8 1 3
   ^i
10 8 4 3 5 7 1 3
     ^i
10 8 7 3 4 5 1 3
       ^i
10 8 7 5 3 4 1 3
...

答案 2 :(得分:0)

我会重新检查你的第三个结果:

10 8 5 3 4 7 1 3

在将'4'换掉之后你最后以'5'作为你的第三个数字,但这还没有结束。如果你继续迭代'j'循环,它将继续测试其余的数字。如果我们正确地运行该循环,它看起来会更像这样:

Starting with 10 8 4 3 5 7 1 3 where i points to the third digit '4':
if (4 < 4) false  // This is an unecessary step FYI, should start the loop with j=i+1
if (4 < 3) false
if (4 < 5) true, swap 4 with 5 = 10 8 5 3 4 7 1 3
  // This is where you seem to have stopped your loop and jumped directly to the next i,
  // However, there is no break and the j loop should continue on using the new third
  // digit '5'...
if (5 < 7) true, swap 5 with 7 = 10 8 7 3 4 5 1 3
if (7 < 1) false
if (7 < 3) false

您最终得到结果10 8 7 3 4 5 1 3作为第三次迭代。