排序演算法之氣泡排序

2021-09-24 13:57:54 字數 1967 閱讀 1982

今天在地鐵上看到有博主分析時間複雜度,提到氣泡排序的時間複雜度是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 是一種電腦科學領域的較簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越大的元素會經由交換慢慢 浮 到數列的頂端,...