日期:2014-05-20  浏览次数:20767 次

本人菜鸟,询问一个关于冒泡排序问题
看了孙卫琴的《java面向对象编程》书当中有一个关于冒泡的排序问题。我开始不理解为何要在内层循环内写int   j=0;j <array.length-i-1;j++)
全部代码如下:
public   class   Arraysort{
    public   static   void   popsort(int   []   array){
          for(int   i=0;i <array.length-1;i++){
              for(int   j=0;j <array.length-i-1;j++){
                      if(array[j]   >   array[j   +1]){
                        int   temp;
                        temp=array[j];
                        array[j]=array[j   +1];
                        array[j   +1]=temp;
                }
            }
        printcount(i+1,array);
        }
    }
public   static   void   printcount(int   time,int   []   array){
      System.out.println( "This   is   the       "+   time   +   "       sort: ");
      for(int   i=0;i <array.length;i++)
          System.out.println(array[i]);
    }
public   static   void   main(String   args[]){
    int   []   array={4,7,5,3,9,0};
    popsort(array);
      }
}

并且以上代码我将那个-i去掉后出现的结果排序是一样的。也就是改为
(int   j=0;j <array.length-1;j++)当然是重新编译后的结果
麻烦给解释一下好么谢谢

------解决方案--------------------
其实每排完一次后.最后边的那一个结果我们是不需要去判断的,就算判断结果也是一样.比如说第一次把最大的排到后边了,那第二次你比较的时候它还不是在最后?第一次要和后边的n-1个比较,第二次的时候就只需要跟后边的n-2个比较了.这样就可以发现问题了.你比较也一样,不比如也可以.
5个数字,排完第一个后,只需要排前面的4个了(5-1)---> 0到3
然后0到2...这样

------解决方案--------------------
去掉也可以的啊
关键是效率
原文的循环体执行了(array.length -1)*(array.length -1) / 2 次
如果去掉的话就要执行(array.length -1)*(array.length -1)次,多了一倍。

多出的次数主要是执行比较语句。

一句话,效率而已!