两个冒泡排序循环之间的实际区别

Posted

技术标签:

【中文标题】两个冒泡排序循环之间的实际区别【英文标题】:Practical difference between two Bubble Sort loops 【发布时间】:2014-02-12 16:17:15 【问题描述】:

我的老师告诉我这是冒泡排序的唯一代码:

int a[] = 2, 3, 7, 9, 8, 1, 4, 5, 10, 6;
for (int i = 0; i < a.length; i++) 
    for (int j = 0; j < a.length - i - 1; j++) 
        if (a[j] > a[j + 1]) 
            int t = a[j];
            a[j] = a[j + 1];
            a[j + 1] = t;
        
    

for (int i = 0; i < a.length; i++) 
    System.out.print(a[i] + "\t");

但我用不同的外循环运行程序:

int b[] = 2, 3, 7, 9, 8, 1, 4, 5, 10, 6;
for (int i = 0; i < b.length - 1; i++) 
    for (int j = 0; j < b.length - i - 1; j++) 
        if (b[j] > b[j + 1]) 
            int t = b[j];
            b[j] = b[j + 1];
            b[j + 1] = t;
        
    

for (int i = 0; i < b.length; i++) 
    System.out.print(b[i] + "\t");

输出是:

第一种情况:

1   2   3   4   5   6   7   8   9   10

第二种情况:

1   2   3   4   5   6   7   8   9   10

所以现在我被告知我的代码是错误的,即使我的输出是正确的。

请告诉我我完全错了吗??

【问题讨论】:

看起来您几乎将冒泡排序“改进”为cocktail sort。 我很确定这些年来我至少看到了两种不同的冒泡排序实现,因此声称这是“唯一”的说法有点可疑......事实上,任何声称一段特定的代码是“唯一的”任何东西都应该侧着看...... 请考虑访问 Academics.se 和programmers.se 【参考方案1】:

两个版本都会正确排序。然而,第一个版本总是会做一个额外的(不必要的)传递,因为它做了 N 传递,而如果考虑一下,一个元素可能改变位置的最大次数是 N-1(这将是最小/最大的数字位于数组的错误末尾)。

所以第二个版本更有效一些,它将复杂度从大约 O(N*N) 降低到 O(N*(N-1))。大致相同。

所以,你的老师应该承认你的代码是正确的。由于老师们经常卡在他们的思维模式中,所以当你和他交谈时要圆滑,并小心地引导他得出上面的结论,即 N-1 次外传就足够了。

【讨论】:

【参考方案2】:

这是一个已知的冒泡排序优化的开始:http://en.wikipedia.org/wiki/Bubble_sort#Optimizing_bubble_sort

【讨论】:

【参考方案3】:

您的外部循环不会遍历所有元素。查看 b.length-1 for(int i=0;i&lt;b.length-1;i++)。这意味着,如果您有 10 个元素,您将迭代到第 8 个元素。由于您同时使用&lt;length-1。如果你想坚持.length-1。您应该将条件更改为i&lt;=b.length-1

【讨论】:

实际上,@The Viper 不需要更改他的代码。这是因为最大的元素被正确放置在开头,因此不需要总迭代。 感谢您的建议。

以上是关于两个冒泡排序循环之间的实际区别的主要内容,如果未能解决你的问题,请参考以下文章

冒泡排序和选择排序--Java

nodejs实现冒泡排序和快速排序

JS中的冒泡排序与选择排序

算法排序之冒泡排序

冒泡排序

冒泡排序