Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 冒泡排序算法中的外循环_Java - Fatal编程技术网

Java 冒泡排序算法中的外循环

Java 冒泡排序算法中的外循环,java,Java,我一直在谷歌上搜索,找不到类似的问题或解释 假设以下代码: 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); } int out,in; 对于(out=nElems-1;out>1;out--) 对于(in=0;在[in+1]中) 互换(in,in+1);

我一直在谷歌上搜索,找不到类似的问题或解释

假设以下代码:

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);
    }
int out,in;
对于(out=nElems-1;out>1;out--)
对于(in=0;在[in+1]中)
互换(in,in+1);
}
为什么外部值达到1后外部循环停止?它不是应该还有两个元素吗?0和1的位置?是什么让我们如此确信它们已经被分类


我了解算法是如何工作的,并且意识到如果没有进行迭代,将有一个更好的解决方案,该解决方案带有一个停止的标志,但我真正感兴趣的是理解上面的代码。

当out达到2时,内部循环从0变为1。它确保[0]和[1]处的两个元素的顺序正确-此时停止气泡排序。但是,您上面介绍的代码随后将比较[1]和[2]——导致可能的交换导致未排序的数组(在比较[1]和[2]之后,应再次比较[0]和[1])。为了让这段代码正常工作,外部循环应该降到1(包括1),因此(out=nElems-1;out>0;out--)的


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

因此,我担心图书代码不起作用,让我们通过示例来证明:

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

交换不应该是
交换(a[in],a[in+1])
?按照你的方式,你是在交换索引而不是数组数据。你有没有试着对上面的代码进行一次试运行?它是从一本书中复制的。无效掉期将处理该问题。:)这个代码真的有效吗?外部循环不是应该在
out>0处结束吗?还是我在错误地解释它@请阅读我的更新答案,并附上证据,这本书的算法真的中断了。这个循环会说
out=1
,因为终止条件是
out>1
。是我错了,还是看不清楚?我可能错了,但我想我更糊涂了。你错了,它确保了[0]和[1]的顺序正确,但是[2]可能会取代[1],而且它没有与[0]对照检查。啊,我明白了。这本书的代码似乎是错的。[in+1]是我没有看到的东西。非常感谢。