冒泡排序算法中的外循环

时间:2014-09-13 17:58:26

标签: java

我一直在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位?是什么让我们确信它们已经排序?

我理解算法是如何工作的,并且意识到如果没有迭代完成就会有一个更好的解决方案,但是我真的很想理解上面的代码。

2 个答案:

答案 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>=1out>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--)

你需要看到的是,在冒泡排序中,内循环正在进行排序的实际工作(通过交换元素)。外部循环只是设置了所有元素已经排序的限制。