我有以下算法来订购带有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
显然,最后一行不是有序的,为什么代码做得对?或者......当我用笔和纸做错时,我哪里错了?
答案 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作为第三次迭代。