演算法 排序演算法之氣泡排序

2021-08-17 19:46:05 字數 2170 閱讀 9542

排序演算法系列目錄說明

排序演算法簡介說明

1. 定義

將一組雜亂無章的資料按一定的規律順次排列起來。例如:

輸入:a1,a2,a3,…,an

輸出:a1』,a2』,a3』,…,an』(滿足a1′ <= a2′ <= a3′ <= … <= an』排列)

2. 演算法效能評估術語言

穩定:如果a原本在b前面,而a=b時,排序之後a仍然在b的前面。

不穩定:如果a原本在b的前面,而a=b時,排序之後a可能出現在b的後面。

內排序:所有排序操作都在記憶體中完成。

外排序:通常是由於資料太大,不能同時存放在記憶體中,根據排序過程的需要而在外存與記憶體之間 資料傳輸才能進行。

時間複雜度:時間頻度,乙個演算法執行所耗費的時間。演算法中通常用資料比較次數與資料移動次數 進行衡量。

空間複雜度:演算法執行所需要的記憶體大小。

氣泡排序(bubble sort)

1. 基本思想

氣泡排序是一種交換排序,核心是冒泡,把陣列中最小的那個往上冒,冒的過程就是和他相鄰的元素交換。

重複走訪要排序的數列,通過兩兩比較相鄰記錄的排序碼。排序過程中每次從後往前冒乙個最小值,且每次能確定乙個數在序列中的最終位置。若發生逆序,則交換;有倆種方式進行冒泡,一種是先把小的冒泡到前邊去,另一種是把大的元素冒泡到後邊。

趣味解釋:

有一群泡泡,其中乙個泡泡跑到乙個泡小妹說,小妹小妹你過來咱倆比比誰大,小妹說哇你好大,於是他跑到了泡小妹前面,又跟前面的乙個泡大哥說,大哥,咱倆比比誰大唄。泡大哥看了他一眼他就老實了。這就是內層的for,那個泡泡跟每個人都比一次。

話說那個泡泡剛老實下來,另乙個泡泡又開始跟別人比誰大了,這就是外層的for,每個泡泡都會做一次跟其他泡泡比個沒完的事。

2. 實現邏輯

通過兩層迴圈控制:

3. **演示bubble_sort

4. 效能分析

解析說明:

氣泡排序涉及相鄰兩兩資料的比較,故需要巢狀兩層 for 迴圈來控制。

外層迴圈 n 次,內層最多時迴圈 n – 1次、最少迴圈 0 次,平均迴圈(n-1)/2;

所以迴圈體內總的比較交換次數為:n*(n-1) / 2 = (n^2-n)/2

按照計算時間複雜度的規則,去掉常數、去掉最高項係數,其複雜度為o(n^2)

最優的空間複雜度為開始元素已排序,則空間複雜度為 0;

最差的空間複雜度為開始元素為逆排序,則空間複雜度為 o(n);

平均的空間複雜度為o(1)

注:

5. **實現(c++版)
// 氣泡排序

void bubble_sort(int arr, int len)

6. 優化改進

6.1 改進方法①

場景一:

在某次遍歷中如果沒有資料交換,說明整個陣列已經有序。若初始序列就是排序好的,如果用基礎的氣泡排序方法,仍然還要比較o(n^2)次,但無交換次數。

改進思路:

通過設定標誌位來記錄此次遍歷有無資料交換,進而可以判斷是否要繼續迴圈,設定乙個flag標記,當在一趟序列中沒有發生交換,則該序列已排序好,但優化後排序的時間複雜度沒有發生量級的改變。

改進**(c++版):

// 氣泡排序改進

void bubble_sort(int arr, int len)

}if (exchange)}}

6.2 改進方法②

場景二:

如果有100個數的陣列,僅前面10個無序,後面90個都已排好序且都大於前面10個數字,那麼在第一趟遍歷後,最後發生交換的位置必定小於10,且這個位置之後的資料必定已經有序了。

改進思路:

記錄某次遍歷時最後發生資料交換的位置pos,這個位置之後的資料顯然已經有序了。因此通過記錄最後發生資料交換的位置就可以確定下次迴圈的範圍了。由於pos位置之後的記錄均已交換到位,故在進行下一趟排序時只要掃瞄到pos位置即可。

改進**(c++版):

// 氣泡排序改進② 

void bubble_sort(int arr, int len)

} }

總結

演算法 排序演算法之氣泡排序

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

排序演算法之氣泡排序

參考 氣泡排序演算法的運作如下 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。針對所有的元素重複以上的步驟,除了最後乙個。持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。若...

排序演算法之氣泡排序

對於大多數學計算機的人來說,氣泡排序應該都是接觸的第一種排序方式,氣泡排序的排序思想是比較簡單的,它的演算法的是 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。針對所有的元素重複以上的步驟,除了...