我一直在google上搜索,但找不到类似的问题或解释。
假设以下代码:
int out, in;
for(out=nElems-1; out>1; out--)
for(in=0; in<out; in++) {
if( a[in] > a[in+1] )
swap(in, in+1);
}
为什么在外部值达到1后外循环停止?它不应该剩下2个元素吗? 0和1位?是什么让我们确信它们已经排序?
我理解算法是如何工作的,并且意识到如果没有迭代完成就会有一个更好的解决方案,但是我真的很想理解上面的代码。
答案 0 :(得分:4)
所以,我担心图书代码不起作用,让我们通过例子来证明:
Array ={3,2,1};//nvm the syntax, i assume pseudocode because we don't even know what is swap()
nElems=3;
For: out=2;
For:in=0
check 0 and 1
Array={2,3,1}
in=1
check 1 and 2
Array={2,1,3}
in=2, break;
out=1, break;
您可以看到流程以数组{2,1,3}结束,但未排序。因此,即使书籍可能有错误,或者如果您提前阅读了几页,您可能会发现它是故意的。正确的冒泡排序将具有条件out>=1
或out>0
编辑:对于包含2个元素的数组,算法将不执行任何操作,甚至是更简单的证明
Array ={2,1};
nElems=2;
For: out=1, break;//out = nElems-1, 1>1 is false
答案 1 :(得分:1)
当out到2时,内循环从0变为1.它确保[0]和[1]中的两个元素的顺序正确 - 这是停止气泡排序的时间。但是,您上面提到的代码将比较[1]和[2] - 导致潜在的交换导致未排序的数组(因为[0]和[1]应该再次进行比较,在[1]和[2]之后相比)。为了使这个代码有效,外部循环应该是downto 1,包括for (out = nElems - 1; out > 0; out--)
。
你需要看到的是,在冒泡排序中,内循环正在进行排序的实际工作(通过交换元素)。外部循环只是设置了所有元素已经排序的限制。