氣泡排序是一種交換排序。
什麼是交換排序呢?
交換排序:兩兩比較待排序的關鍵字,並交換不滿足次序要求的那對數,直到整個表都滿足次序要求為止。
它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。
這個演算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端,故名。
假設有乙個大小為 n 的無序序列。氣泡排序就是要每趟排序過程中通過兩兩比較,找到第i個小(大)的元素,將其往上排。
以上圖為例,演示一下氣泡排序的實際流程:
假設有乙個無序序列
第一趟排序:通過兩兩比較,找到第一小的數值 1 ,將其放在序列的第一位。
第二趟排序:通過兩兩比較,找到第二小的數值 2 ,將其放在序列的第二位。
第三趟排序:通過兩兩比較,找到第三小的數值 3 ,將其放在序列的第三位。
至此,所有元素已經有序,排序結束。
要將以上流程轉化為**,我們需要像機器一樣去思考,不然編譯器可看不懂。
假設要對乙個大小為 n 的無序序列進行公升序排序(即從小到大)。
(1) 每趟排序過程中需要通過比較找到第 i 個小的元素。
所以,我們需要乙個外部迴圈,從陣列首端(下標 0) 開始,一直掃瞄到倒數第二個元素(即下標 n - 2) ,剩下最後乙個元素,必然為最大。
(2) 假設是第 i 趟排序,可知,前 i-1 個元素已經有序。現在要找第 i 個元素,只需從陣列末端開始,掃瞄到第 i 個元素,將它們兩兩比較即可。
所以,需要乙個內部迴圈,從陣列末端開始(下標 n - 1),掃瞄到 (下標 i + 1)。
核心**
void bubblesort(int *list,int排序類別n) }}}
排序方法
時間複雜度
空間複雜度
穩定性複雜性
平均情況
最壞情況
最好情況
交換排序
氣泡排序
o(n2)
o(n2)
o(n)
o(1)
穩定簡單
若檔案的初始狀態是正序的,一趟掃瞄即可完成排序。所需的關鍵字比較次數c和記錄移動次數m均達到最小值:cmin = n - 1, mmin = 0。所以,氣泡排序最好時間複雜度為o(n)。 若初始檔案是反序的,需要進行 n -1 趟排序。每趟排序要進行 n - i 次關鍵字的比較(1 ≤ i ≤ n - 1),且每次比較都必須移動記錄三次來達到交換記錄位置。在這種情況下,比較和移動次數均達到最大值: cmax = n(n-1)/2 = o(n2) mmax = 3n(n-1)/2 = o(n2) 氣泡排序的最壞時間複雜度為o(n2)。 因此,氣泡排序的平均時間複雜度為o(n2)。 總結起來,其實就是一句話:當資料越接近正序時,氣泡排序效能越好。
氣泡排序就是把小的元素往前調或者把大的元素往後調。比較是相鄰的兩個元素比較,交換也發生在這兩個元素之間。
所以相同元素的前後順序並沒有改變,所以氣泡排序是一種穩定排序演算法。
對氣泡排序常見的改進方法是加入標誌性變數exchange,用於標誌某一趟排序過程中是否有資料交換。
如果進行某一趟排序時並沒有進行資料交換,則說明所有資料已經有序,可立即結束排序,避免不必要的比較過程
void bubblesort(int *list,int執行結果排序前: 2 9 9 7 1 9 0 2 6 8n) }
if(false==bchange)//
當不再發生資料交換,跳出整個迴圈
break
; }
}
第 0 趟: 0 2 9 9 7 1 9 2 6 8
第 1 趟: 0 1 2 9 9 7 2 9 6 8
第 2 趟: 0 1 2 2 9 9 7 6 9 8
第 3 趟: 0 1 2 2 6 9 9 7 8 9
第 4 趟: 0 1 2 2 6 7 9 9 8 9
第 5 趟: 0 1 2 2 6 7 8 9 9 9
排序後: 0 1 2 2 6 7 8 9 9 9
演算法(2)排序之氣泡排序
氣泡排序核心思路 每乙個元素 j 和其後面乙個元素 j 1 比較,如果前者 j 大則交換,無論交換與否,讓後面元素 j 1 何其下乙個元素 j 2 接著進行比較 看圖說明,不想寫流程了 設定指標 i,j i 從角標 0 開始,到 n 1 結束,j 每次從 1 開始,到 n i 1 結束 其實 i 表...
03 排序 氣泡排序
基本原理 顧名思義就是整個過程向氣泡一樣往上公升,單向氣泡排序的基本原理就是 對於給定的n個資料,從第乙個資料開始一次對相鄰的兩個記錄進行比較,當前面的記錄大於後面的記錄時,交換位置,進行一輪比較和換位後,n個記錄中最大的那個被排在最後,即第n位。然後對前面n 1個記錄進行第二次比較,重複該過程。實...
09 排序1 排序
09 排序1 排序 25 分 給定n 個 長整型範圍內的 整數,要求輸出從小到大排序後的結果。本題旨在測試各種不同的排序演算法在各種資料情況下的表現。各組測試資料特點如下 include include includeusing namespace std const int cutoff 1000...