1. 程式人生 > >【初探】 —— 氣泡排序

【初探】 —— 氣泡排序

 


普通的氣泡排序


● 氣泡排序是一種交換排序。

 什麼是交換排序呢?

交換排序:兩兩比較待排序的關鍵字,並交換不滿足次序要求的那對數,直到整個表都滿足次序要求為止。

 ● 氣泡排序(Bubble Sort)是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。

 ● 氣泡排序演算法的運作如下:

 

  •    是臨近的數字兩兩進行比較,按照從小到大或者從大到小的順序進行交換,
  • 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最大或最小的數字被交換到了最後一位(每將一個數歸位我們將其稱為“一趟冒泡”)
  •  針對所有的元素重複以上的步驟,直到最後一個尚未歸位的數,已經歸位的數列無需在進行比較,(比如第二趟冒泡,最後一個數就不需要比較了,因為第一次冒泡已經確定了最後一個數是該數列中最大或最小的數,所以就不需要在進行比較了)。
  • 持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。

由於它的簡潔,氣泡排序通常被用來對於程式設計入門的學生介紹演算法的概念。

這裡寫圖片描述

 

● “氣泡排序”的原理是:

每一趟只能確定將一個數歸位。即第一趟只能確定將末位上的 數(即第 5 位)歸位,第二趟只能將倒數第 2 位上的數(即第 4 位)歸位,第三趟只能將倒 數第 3 位上的數(即第 3 位)歸位,而現在前面還有兩個位置上的數沒有歸位,因此我們仍 
然需要進行“第四趟”。

● 最後我們總結一下:如果有 n 個數進行排序,只需將 n-1 個數歸位,也就是說要進行 n-1 趟操作。 而“每一趟”都需要從第 1 位開始進行相鄰兩個數的比較,將較小的一個數放 在後面,比較完畢後向後挪一位繼續比較下面兩個相鄰數的大小,重複此步驟,直到最後一 
個尚未歸位的數,已經歸位的數則無需再進行比較(已經歸位的數你還比較個啥,浪費表情)。

 


 

使用標誌的氣泡排序


帶標誌非常有效,全部排序都需要這個,新手這個務必掌握。只要這一趟沒有發生交換,那麼就會停止迴圈掃描,減少了掃描的次數。一個很簡單的例子,比如一個順序的一組元素,就拿1,2,3,4,5來說吧,第一趟掃描完,發現沒有元素交換,如果沒有標誌,最外層迴圈條件為for( i=1; i

這裡寫圖片描述

時間複雜度


1.設物件個數為n 個,比較次數和移動次數與初始排序有關

若檔案的初始狀態是正序的(如:1 2 3 4 5),一趟掃描即可完成排序。所需的關鍵字比較次數C和記錄移動次數M均達到最小值:Cmin = N - 1, Mmin = 0。所以,氣泡排序最好時間複雜度為O(N)。

若初始檔案是反序的(如:5 4 3 2 1),需要進行 N -1 趟排序 , 第i趟比較n-i次關鍵字的比較(1 ≤ i ≤ N - 1),且每次比較都必須移動記錄三次來達到交換記錄位置。在這種情況下,比較和移動次數均達到最大值:

Cmax = N(N-1)/2 = O(N²) 
Mmax = 3N(N-1)/2 = O(N²)

氣泡排序的最壞時間複雜度為O(N²)。 
因此,氣泡排序的平均時間複雜度為O(N²)。 
空間複雜度為O(1) 
總結起來,其實就是一句話:當資料越接近正序時,氣泡排序效能越好。

 

演算法穩定性
氣泡排序就是把小的元素往前調或者把大的元素往後調。比較是相鄰的兩個元素比較,交換也發生在這兩個元素之間。

所以相同元素的前後順序並沒有改變,所以氣泡排序是一種穩定排序演算法。
​​​​​​​