排序–冒泡排序

  • 2019 年 10 月 20 日
  • 筆記

1、什麼是冒泡排序?

 

 

 

就是把一個無序數組內的元素,從頭開始,兩兩比較並交換位置,直到把最大(最小)的一位放置在隊尾

2、程式碼原理:

  • 比較相鄰的元素。如果第一個比第二個大,就交換它們兩個;
  • 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對,這樣在最後的元素應該會是最大的數;
  • 針對所有的元素重複以上的步驟,除了最後一個;
  • 重複步驟1~3,直到排序完成。

3、程式碼實現

public class ArrSort {      public static void main(String[] args) {          int[] arr={3,9,-1,10,20};          int temp=0;          for (int j=0;j<arr.length-1;j++){              //第i遍              for (int i=0;i<arr.length-1-j;i++){                  if (arr[i]>arr[i+1]){ //左邊元素比右邊大就交換位置                      temp=arr[i];                      arr[i]=arr[i+1];                      arr[i+1]=temp;                  }              }              System.out.println("第"+j+"次排序");              System.out.println(Arrays.toString(arr));            }      }  }

4、優化

按照上述的程式碼,每次排序都要進行arr.length-1輪,但是有可能前面幾輪就已經達到排序好的效果,後面做的就是無用功

 

 

 如圖第二輪已經達到排序完成的效果,怎麼優化?

加一個判定條件,如果沒有發生元素的交換,就說明已經排序完成了

public class ArrSort {      public static void main(String[] args) {          int[] arr={3,9,-1,10,20};          int temp=0;          //設置一個開關          boolean flag=false;          for (int j=0;j<arr.length-1;j++){              //第一遍                for (int i=0;i<arr.length-1-j;i++){                  if (arr[i]>arr[i+1]){  //發生元素交換就置為true,這一輪完成後再判斷                      flag=true;                      temp=arr[i];                      arr[i]=arr[i+1];                      arr[i+1]=temp;                  }              }              if (flag){  //說明發生了元素交換,繼續進行下一輪                  System.out.println("第"+j+"次排序");                  System.out.println(Arrays.toString(arr));                  flag=false;   //再把flag置為初始值              }else{  //沒有進行元素交換,就跳出循環條件,排序完成                  System.out.println("排序結束");                  break;              }          }      }  }

5、時間複雜度

由上述程式碼可發現,冒泡排序是用了雙層for循環,所以O(n^2)