今天在地鐵上看到有博主分析時間複雜度,提到氣泡排序的時間複雜度是o(n²) 。我竟然想起這麼多年沒有再寫過冒泡了,於是乎自己再動手整理一遍算是複習也是新的學習。
冒泡的思想其實就是兩兩比較,每趟都能確定乙個最大/最小的數值在最末尾。
那舉例來說明,例:我們要將陣列int a =做正序排序。這是乙個比較極端的情況。我們來分析一下冒泡的思想。
1.a[0]和a[1]比較,a[0]>a[1] == true ? a[0] 交換至a[1]的位置 : a[0]原封不動
2.a[1]和a[2]再做相同操作,直到a[a.length-2]和a[length-1]比較完畢。
故此,我們的結果是
* 6,5,4,3,2,1,7
* 5,4,3,2,1,6,7
* 4,3,2,1,5,6,7
* 3,2,1,4,5,6,7
* 2,1,3,4,5,6,7
* 1,2,3,4,5,6,7
按照剛才的思想,我們編寫如下**:
integer a = new integer ;
int temp = 0;
for (int i = 0; i < a.length; i++)
}}/*------------------------- 排序後的結果----------------------*/
1 2 3 4 5 6 7
大家有沒有注意到,按照冒泡的思想我們只需要走a.length-1次就可以完成整個操作 ,而上面的**走了a.length次。
另外,每次都可以在尾部確立乙個最大數,那除去第一次比較其他次數有必要再和最大值作比較嗎?我們可以減掉外層迴圈的變數剛好規避掉這個問題。所以我們的排序可以變為:
* 6,5,4,3,2,1, 7 確立了7是最大下次7不參與 排序完i=1
* 5,4,3,2,1, 6,7 確立了6是最大,但該趟排序的6沒有與7比較,因為內迴圈減掉了i
* 4,3,2,1, 5,6,7 同上,5不與6比較...
* 3,2,1, 4,5,6,7
* 2,1, 3,4,5,6,7
* 1, 2,3,4,5,6,7 最後一趟第一位一定是最小的數值了
因為大家都兩兩比較過
就算最極端的情況最小的數在最末尾
它也被帶到了a[0]的位置上。故此可以不用比較了
**變為:
integer a = new integer ;
int temp = 0;
for (int i = 0; i < a.length-1; i++)
}}
ok,優化完畢了。目前還有乙個問題沒有考慮,我們是用最極端的情況,那有沒有最優情況呢?
比如我們需要排序的陣列為:int a =
相比較上面的情況有什麼區別呢?對嘍,就是我們第一趟比較的時候發現我們if的條件沒有乙個成立的
此時我們根據發現再來優化。
integer a = new integer ;
int temp = 0;
boolean flag = false;//設立flag檢測
for (int i = 0; i < a.length-1; i++)
}//當第一趟比較完我們來檢查flag的值
if(!flag)
break;//直接跳出,說明是完全有序的狀態
}
ok。講完了。
現在來想想地鐵上看到的博主分享的氣泡排序的時間複雜度。沒錯,一般情況下他的時間複雜度就是o(n²)。那如果是最優情況的話只需要比較n-1替換0,所以時間複雜度可以是o(n)。
ok,以上。有不足之處歡迎指正共同學習進步!
排序演算法之氣泡排序
參考 氣泡排序演算法的運作如下 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。針對所有的元素重複以上的步驟,除了最後乙個。持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。若...
排序演算法之氣泡排序
對於大多數學計算機的人來說,氣泡排序應該都是接觸的第一種排序方式,氣泡排序的排序思想是比較簡單的,它的演算法的是 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。針對所有的元素重複以上的步驟,除了...
排序演算法之氣泡排序
氣泡排序 bubble sort 是一種電腦科學領域的較簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越大的元素會經由交換慢慢 浮 到數列的頂端,...