關於冒泡排序及其小優化

冒泡排序,顧名思義,就像魚缸裏魚吐泡泡一樣從下往上升,至於怎麼升是兩兩比較,然後把大的(或者小的)換上去

import java.util.Random;


public class Start {

    /**
     * @param args
     */
    public static void Sort()
    {
        //生成一個數組
        int []array=new int[10];
        for(int i=0;i<array.length;i++)
        {
            array[i]=new Random().nextInt(10);
        }

      //開始排序
      for(int i=0;i<array.length;i++)
      {
          //開始兩兩比較
          /*如果大,則交換,循環完array[0]最大,所以條件j>i就是第一個就不用比較了*/
          for(int j=array.length-1;j>i;j--)
          {
              if(array[j]>array[j-1])
              {

                  int temp=array[j];
                  array[j]=array[j-1];
                  array[j-1]=temp;

              }
          }
      }
      for (int i : array) 
      {
        System.out.println(i);
      }
    }
    public static void main(String[] args)
    {
        Sort();
    }

}

但是如果生成的數組是10,9,8,7,6,5,4,3,1,2 就最後兩個不一樣,還要循環10次,這就有點傻了,在小循環兩兩比較時如果發現array[j]一直比array[j-1]大不是正好就說明這個數組已經排好了嗎,你可以打個斷點輸出數值細細體會

import java.util.Random;


public class Start {

    /**
     * @param args
     */
    public static void Sort()
    {
        //設置一個變量,如果控制大循環是否還需要繼續(不需要循環10次)
        boolean flag=true;
        int []array=new int[10];
        for(int i=0;i<array.length;i++)
        {
            array[i]=new Random().nextInt(10);
        }

      for(int i=0;i<array.length&&flag;i++)
      {
          flag=false;
          /*在上面flag設置成了false,下面的循環中如果if沒有被執行說明數組已經是排好了的,不需要再繼續外循環了,flag沒有設置成true大循環失效*/
          for(int j=array.length-1;j>i;j--)
          {

              if(array[j]>array[j-1])
              { 
                  int temp=array[j];
                  array[j]=array[j-1];
                  array[j-1]=temp;
                  flag=true;
              }
          }
      }
      for (int i : array) 
      {
        System.out.println(i);
    }
    }
    public static void main(String[] args)
    {
        Sort();

    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章