標籤:排序演算法 c++ 面試 資料結構 冒泡排序
基本思想:
冒泡排序是通過交換兩個元素實現的,其思想是:
第一趟將待排序序列(A[0]~A[n-1])從前往後,兩兩相鄰元素進行比較,若後者小,則交換,比較n-1次;
第一趟結束後,最大元素被交換到A[n-1]處(即沉底),下一趟排序只需要在(A[0]~A[n-2])中進行;
若在某趟排序中,未交換元素,說明子序列已經有序,則不在進行下一趟排序。該方法最多進行n-1趟。
冒泡排序樣本:
代碼:
void BubbleSort(int A[],int n)//冒泡排序{int i, j ,last;i=n-1;while(i>0){last=0;//最多進行n-1趟for(j=0; j<i; j++)//從前往後比較{if(A[j+1]<A[j])//前面一個較大,就交換{swap(A[j],A[j+1]); last=j;}}i=last;//若一趟排序中沒有交換元素,則last為0,i為0跳出迴圈}}
改進的冒泡演算法:
正向和反向進行最大值和最小值的排序。(ps:其實有些筆者將上面的演算法思想也看作冒泡的改進演算法~~)
void ImproveBubbleSort(int A[],int n)//改進冒泡{int low,high,j;low=0;high=n-1;while(low<high){for(j=low; j<high; j++)//從前往後,大的交換到後面{if(A[j+1]<A[j])//如果前一個比後一個大,交換{swap(A[j],A[j+1]);}}--high;for(j=high; j>low; j--)//從後往前,小的交換到前面{if(A[j]<A[j-1])//如果後一個比前一個小,交換{swap(A[j],A[j-1]);}}++low;}}
時間複雜度分析:
冒泡排序最好情況下只需進行一趟排序,n-1次比較,因此最好情況下時間複雜度是O(n),無需移動元素;最壞的情況下進行n-1趟,第 i 趟比較 n-i次,最壞的情況下時間複雜度是O(n^2)。
此外,冒泡經過一趟排序後,能最終確定元素的最終位置,冒泡排序是穩定的排序方法。
參考資料:
《資料結構》 陳慧楠著 人民郵電出版社
排序演算法之冒泡排序