氣泡排序+怎麼計算時間複雜度
氣泡排序的基本思想
時間複雜度為O(N^2)
每次比較兩個相鄰元素,如果他們的順序錯誤就把它們交換過來。
舉個栗子
例如我們需要將 12,35,99,18,76, 5個數進行從大到小排序,既然是從大到小排序,也就是越小越靠後。
首先比較第一個數和第二個數,第一個是12,第二個是35,發現12 小於35,由於是越小越靠後,因此要對這兩個數交換位置,那麼交換後的順序為 35,12,99,18,76。按照之前的方法,我們比較第二個和第三個數,第二個是12第三個是99,99大於12,所以要交換兩個數的位置,交換過的順序為 35,99,12,18,76。以此類推,可以通過下圖來看12的位置變化:
12,35,99,18,76 初始資料
35,12,99,18,76 第1次交換
35,99,12,18,76 第2次交換
35,99,18,12,76 第3次交換
35,99,18,76,12 第4次交換 (5-1,假設要排序的個數為m,那麼比較次數m-1,那麼最糟糕情況下互動次數就是m-1)
進行4次交換後,就成功把最小的數12給排到最後面了。
現在我們已經將最小的數給歸位了,現在對剩下的數再進行歸位,細節我就不講了,就將下重要的。
對剩下4個數進行排序:
99,18,76,35,12 (交換了3次,比較次數3)
對剩下3個數進行排序:
99,76,18,35,12 (比較了1次【99,76】,交換了1次【18,76】,比較次數2)
對剩下2個數進行排序:
99,76,18,35,12 (交換了0次,比較1次)
就如同一個氣泡,一步步向上翻滾,最後成功浮出水面,所以他叫氣泡排序。
程式碼
public static void main(String[] args) { //生成資料來源 //待排序個數 int n=5; int src[]=new int[n]; src[0]=12; src[1]=35; src[2]=99; src[3]=18; src[4]=76; //氣泡排序 //遍歷第一個到最後一個 for (int i=0; i<n;i++) {//執行n次 //比較剩餘的資料 for (int j=0 ;j<n-i-1; j++) {//j<n-i-1 防止src[j+1]陣列越界,執行n-1次 if(src[j]<src[j+1]){ int temp=src[j+1];//最差情況執行n-1次 src[j+1]=src[j];//最差情況執行n-1次 src[j]=temp;//最差情況執行n-1次 } } } //列印排序 for (int i=0; i<n;i++) { System.out.println(src[i]);//最差情況執行n次 } } // 結果 // 99 // 76 // 35 // 18 // 12 }
為什麼時間複雜度為O(N^2)
計算最糟糕情況
要排序的個數n
第一層for
執行了n次
第二層for
第一次比較了n-1次
第二次比較了n-2次
....
第n-1次比較了1次
執行的總次數
count=3(1+2+3+4+.....+n-1)(n為正整數)
列印for
執行了n次
所有總的次數:
sum=n+3(1+2+3+4+...+n-1)+n+(n-n)=3(1+2+3+4+...+n-1+n)-n
如果n為偶數
sum=3* n/2*(n+1) -n=3/2(n^2+n)-n=1/2(3n^2+n)
如果n為奇數
sum=3((n-1)/2 *n+(n+1)/2)-n=3/2(n^2+1)-n=1/2(3n^2-2n+3)
所以最差的情況的時間複雜度為O(N^2),最好的情況我就不推了,O(N)