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

时间:2014-01-22 14:33:57

标签: java bubble-sort

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

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

所以现在我被告知我的代码错了,即使我的输出正确。 请告诉我,我完全错了吗?

3 个答案:

答案 0 :(得分:4)

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

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

因此,您的老师识别您的代码是否正确。由于教师经常被困在他们的思维模式中,所以当你和他交谈时要对他们进行外交,并小心地让他得出结论,N-1外传就足够了。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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