首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >两个气泡排序回路的实际区别

两个气泡排序回路的实际区别
EN

Stack Overflow用户
提问于 2014-01-22 14:33:56
回答 3查看 118关注 0票数 6

我的老师告诉我,这是泡泡类的唯一代码:

代码语言:javascript
复制
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");
}

但我运行的程序有一个不同的外部循环:

代码语言:javascript
复制
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");
}

产出如下:

第一宗案件:

代码语言:javascript
复制
1   2   3   4   5   6   7   8   9   10

第二宗案件:

代码语言:javascript
复制
1   2   3   4   5   6   7   8   9   10

因此,现在有人告诉我,我的代码是错误的,即使我的输出是正确的。

拜托,告诉我我完全错了吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-22 15:51:18

这两个版本都将正确排序。然而,第一个版本总是会执行额外的(不必要的)传递,因为它的执行N通过,而如果考虑到它,元素可能改变位置的最大次数是N1(当最小/最大的数字位于数组的错误端时)。

因此第二个版本更有效,它将复杂度从大约O(N*N)降低到O(N*(N1))。基本上是一样的。

所以,你的老师应该认识到你的代码是正确的。由于老师经常被困在他们的思维模式中,所以当你与他交谈时,要对此保持外交态度,并小心地引导他得出以上结论,即N-1外传就足够了。

票数 5
EN

Stack Overflow用户

发布于 2014-01-22 15:23:26

这是一个已知的泡沫排序优化的开始:sort

票数 2
EN

Stack Overflow用户

发布于 2014-01-22 15:11:13

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21285770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档