1. 程式人生 > >Java中陣列的氣泡排序,氣泡排序優化

Java中陣列的氣泡排序,氣泡排序優化

氣泡排序:

 思路:
        int[] arr={3,4,2,6,1};
      1.第一次排序,從索引[0]開始,依次兩兩比較。索引[0]與[1]比,[1]與[2]比,[2]與[3]比……
      
        if(arr[0]<arr[1]){
          元素的位置不變;   
        }
        
        if(arr[1]>arr[2]){
          //交換位置
          int temp=arr[1];
          arr[1]=arr[2];
          arr[2]=arr[temp];
        }
        
          如長度為n(5)的陣列arr ,第一次排序,共比較n-1(4)次;排序後為{3,2,4,1,6},此時陣列的最後
       一個元素為陣列的最大值;
       
       2.第二次排序(假設共需排序i次,此時索引[i]=1):
           依次類推,此時元素的最大值已經確定,也就是陣列的最後兩個元素不用比較了。排序後的陣列
       為{2,3,1,4,6},共比較了n-1-i(3)次
       
       ......

程式碼:


     public static void main(String[] args) {

        int[] arr={3,4,2,6,1};
        System.out.println("當前陣列:"+ Arrays.toString(arr));

        for (int i = 0; i < arr.length-1; i++) { //最外層,共需排序n-1次
            for (int j = 0; j <arr.length-1-i; j++) {//內層,第i次排序需排序n-i-i次
                if
(arr[j]>arr[j+1]) { //交換位置 int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } System.out.println("排序後:"+ Arrays.toString(arr)); }

氣泡排序優點:

  氣泡排序的優點:每進行一趟排序,就會少比較一次,因為每進行一趟排 序都會找出一個較大值。
                 每一趟少比較一次,一定程度上減少了演算法的量。
  時間複雜度為:O(n²) tip:這個我是直接記得,不整為什麼了

氣泡排序法存在的不足及改進方法:

    第一,在排序過程中,執行完最後的排序後,雖然資料已全部排序完備,但程式無法判斷是否完成排       
 序,為了解決這一不足,可設定一個標誌位flag,將其初始值設定為非0,表示被排序的表是一個
 無序的表,每一次排序開始前設定flag值為0,在進行資料交換時,修改flag為非0。在新一輪排序
 開始時,檢查此標誌,若此標誌為0,表示上一次沒有做過交換資料,則結束排序;否則進行排序
 
 此段轉自https://www.cnblogs.com/xiaoming0601/p/5866048.html 他那的冒泡優化有點小問題0.0

氣泡排序優化


        int[] arr={3,4,5,6,7};
        System.out.println("當前陣列:"+ Arrays.toString(arr));

        boolean flag=false; //新增的程式碼,用flag標記,也可以新增一個計數器
        
        for (int i = 0; i < arr.length-1; i++) { //最外層,共需排序n-1次
            for (int j = 0; j <arr.length-1-i; j++) {//內層,第i次排序需排序n-i-1次
                if(arr[j]>arr[j+1]) {
                    //交換位置
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    flag=true;
                }
            }
            //新增的程式碼
            if(!flag){
                break;//如果陣列沒有生改變,flag則仍為為false,此時執行這段程式碼,跳出迴圈
            }

        }
        System.out.println("排序後:"+ Arrays.toString(arr));

-----------------------------------------------------我是分割線----------------------------------------------------------------

插入排序和選擇排序也重新整一片吧