1、冒泡排序的思想
依次比較相鄰的兩個數,將大數放在前面,小數放在後面。
具體的步驟: 首先從數列開頭比較第1個和第2個數,將大數放前,小數放後。然後比較第2個數和第3個數,將大數放前,小數放後,如此繼續完成第一趟,最小數將沉到底部。 重複以上過程直至最終完成排序。
2、冒泡排序的實現
void bubble_sort(int *a, int size)
{
int i, j, t;
for(i = 1; i < size; ++i)//n-1次(後n-1個元素排好序,第1個自然就是最小的)
{
for(j = 0; j < size -i; ++j)//每有一個元素排好序,比較次數就少1
{
if(a[j] > a[j+1]){
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
} // end for j
}// end for i
}
對於上邊的bubble_sort(),我們發現當第一次外層循環完成後,排序就完成了,後面的循環只有比較,而沒有交換。這樣,我們可以設置一個布爾變量,記錄一次外層循環中是否發生交換,如果未發生交換,算法就返回。改進後的代碼如下bubble_sort_enhanced()所示。
void bubble_sort_enhanced(int *a, int size)
{
int i, j, t;
unsigned char swapped;
for(i = 1; i < size; ++i) {
swapped = 0;
for(j = 0; j < size - i; ++j) {
if(a[j] > a[j+1]){
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
swapped = 1;
}
}
if(!swapped)
break;
}
}
3、冒泡排序的性能
1)、時間複雜度
平均時間複雜度接近於最差時間複雜度,是O(n^2)。因爲逆序情況下比較和交換次數均爲(n-1)+(n-2)+…+i+…1,即n*(n-1)/2。
最好的情況下,該算法複雜度是O(n)。因爲按照改進的算法,對於一個已經有序的數組,算法完成第一次外層循環後就會返回。實際上只發生了 N - 1次比較。
2)、穩定性
冒泡排序是穩定的。
和其它層算法的比較:
快速排序和冒泡排序都是基於比較的排序。