理论基础 —— 排序 —— 原始冒泡排序
【概述】
冒泡排序是一種穩定的排序方法,也是交換排序中最簡單的排序方法,其基本思想是:兩兩比較相鄰記錄的關鍵碼,若反序則交換,直到沒有反序為止。
冒泡排序的實現依靠,雙重循環,外層 i 控制進行多少輪,內層循環 j 控制每輪比較的次數,對于 n 個元素,共進行 n-1 趟交換,每趟比較 n-i 次。
【排序過程】
1.排序過程
具體的排序過程為:
?2.實例
初始關鍵字: ?『?6,5,3,1,8,7,2,4?』
?第一趟排序: ?『6,5,3,1,8,7,2,4?』
?? ? ? ? ? ? ? ? ? ? ? ? ?5,『?6,3,1,8,7,2,4?』
???????????????????????? ?5,3,『?6,1,8,7,2,4?』
???????????????????????? ?5,3,1,『?6,8,7,2,4?』
?? ? ? ? ? ? ? ? ? ? ? ? ?5,3,1,6,『?8,7,2,4?』
?? ? ? ? ? ? ? ? ? ? ? ? ?5,3,1,6,7,『?8,2,4?』
?? ? ? ? ? ? ? ? ? ? ? ? ?5,3,1,6,7,2,『?8,4?』
?? ? ? ? ? ? ? ? ? ? ? ? ?5,3,1,6,7,2,4,『?8?』
第二趟排序: ?『?5,3,1,6,7,2,4?』,8
?? ? ? ? ? ? ? ? ? ? ? ? ?3,『5,1,6,7,2,4』,8
?? ? ? ? ? ? ? ? ? ? ? ? ?3,1,『5,6,7,2,4』,8
?? ? ? ? ? ? ? ? ? ? ? ? ?3,1,5,『6,7,2,4』,8
?? ? ? ? ? ? ? ? ? ? ? ? ?3,1,5,6,『7,2,4』,8
?? ? ? ? ? ? ? ? ? ? ? ? ?3,1,5,6,2,『7,4』,8
?? ? ? ? ? ? ? ? ? ? ? ? ?3,1,5,6,2,4,『7』,8
第三趟排序: ?『?3,1,5,6,2,4?』,7,8
?? ? ? ? ? ? ? ? ? ? ? ? ?1,『3,5,6,2,4』,7,8
?? ? ? ? ? ? ? ? ? ? ? ? ?1,3,『5,6,2,4』,7,8
?? ? ? ? ? ? ? ? ? ? ? ? ?1,3,5,『6,2,4』,7,8
?? ? ? ? ? ? ? ? ? ? ? ? ?1,3,5,2,『6,4』,7,8
?? ? ? ? ? ? ? ? ? ? ? ? ?1,3,5,2,4,『6』,7,8
第四趟排序: ?『?1,3,5,2,4?』,6,7,8
?? ? ? ? ? ? ? ? ? ? ? ? ?1,『3,5,2,4』,6,7,8
?? ? ? ? ? ? ? ? ? ? ? ? ?1,3,『5,2,4』,6,7,8
?? ? ? ? ? ? ? ? ? ? ? ? ?1,3,2,『5,4』,6,7,8
?? ? ? ? ? ? ? ? ? ? ? ? ?1,3,2,4,『5』,6,7,8
第五趟排序: ?『?1,3,2,4?』,5,6,7,8
?? ? ? ? ? ? ? ? ? ? ? ? ?1,『3,2,4』,5,6,7,8
?? ? ? ? ? ? ? ? ? ? ? ? ?1,2,『3,4』,5,6,7,8
?? ? ? ? ? ? ? ? ? ? ? ? ?1,2,3,『4』,5,6,7,8
第六趟排序: ?『?1,2,3?』,4,5,6,7,8
?? ? ? ? ? ? ? ? ? ? ? ? ?1,『2,3』,4,5,6,7,8
?? ? ? ? ? ? ? ? ? ? ? ? ?1,2,『3』,4,5,6,7,8
第七趟排序: ?『?1,2?』,3,4,5,6,7,8
?? ? ? ? ? ? ? ? ? ? ? ?『?1?』,2,3,4,5,6,7,8
?結果: ? ? ???『??1,2,3,4,5,6,7,8 ?』
??
? ? ? ? ? ? ? ? ? ? ? 排序過程? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?宏觀過程
【時空復雜度分析】
最好的情況,是要排序的表本身就是有序的,那么在加了判斷優化的實現中,只需要進行 n-1 次比較,沒有數據交換,因此最優時間復雜度為 O(n)
最壞的情況,是要排序的表是逆序的情況,因此供需比較 n(n-1)/2 次,并作等數量級的記錄移動,因此最壞時間復雜度為 O(n^2)
而在平均情況下,時間復雜度與最壞時間復雜度同數量級,即平均時間復雜度為 O(n^2)
此外,冒泡排序僅需一個輔助空間,用于作記錄交換的暫存單元,即空間復雜度為 O(1)
【源程序】?
1.樸素實現
void bubbleSort(int a[],int n){for(int i=1;i<=n-1;i++)//比較n-1趟for(int j=1;j<=n-i;j++)//每趟交換n-i次if(a[j]>a[j+1])swap(a[j],a[j+1]); }2.判斷優化
void bubbleSort(int a[],int n){for(int i=1;i<=n-1;i++){//比較n-1趟bool flag=true;//判斷是否有交換for(int j=1;j<=n-i;j++){//每趟交換n-i次if(a[j]>a[j+1]){swap(a[j],a[j+1]);flag=false;//有交換說明仍需排序}}if(flag)//若無交換,終止循環break;} }總結
以上是生活随笔為你收集整理的理论基础 —— 排序 —— 原始冒泡排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 配对碱基链(信息学奥赛一本通-T1135
- 下一篇: 信息学奥赛一本通C++语言——1109: