两个冒泡排序循环之间的实际区别
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<b.length-1;i++)
。这意味着,如果您有 10 个元素,您将迭代到第 8 个元素。由于您同时使用<
和length-1
。如果你想坚持.length-1
。您应该将条件更改为i<=b.length-1
。
【讨论】:
实际上,@The Viper 不需要更改他的代码。这是因为最大的元素被正确放置在开头,因此不需要总迭代。 感谢您的建议。以上是关于两个冒泡排序循环之间的实际区别的主要内容,如果未能解决你的问题,请参考以下文章