冒泡排序算法的原理:
1、比較相鄰的元素,如果第一個比第二個大,就交換它們兩個。
2、對每一組相鄰元素做同樣的操作,一趟完成後,最後的元素就是最大的數。
3、對所有元素重複上述步驟,除了最後一個數
4、持續每次對越來越少的元素重複上面的步驟,知道沒有任何一對數字需要比較。
算法代碼如下:
void BubbleSort(int a[], int n)
{
int temp;
for (int i = 0 ; i < n - 1; ++i)
{
for (int j = 0; j < n - 1 - i; ++j)
{
if (a[j] > a[j+1])
{
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
}
加入我們的待排序記錄是{2,1,3,4,5,6,7,8,9}在第一趟交換了1和2之後,序列已經有序,因此後面的比較趟數都不需要了,但是算法仍然會執行剩下無用的操作 ,因此我們可以在原有算法基礎上做一些優化,優化後的代碼如下:
void BubbleSort(int a[], int n)
{
int temp;
Status flag = TRUE;
for (int i = 0 ; i < n - 1 && flag == TRUE; ++i)
{
flag = FALSE;
for (int j = 0; j < n - 1 - i; ++j)
{
if (a[j] > a[j+1])
{
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
flag = TRUE;
}
}
}
}
通過加入一個標識變量,如果發現一趟下來沒有可交換的元素,則表示序列已排好序。
時間複雜度:
如果待比較記錄集合一開始就是有序的,那只需要比較n-1次,時間複雜度爲O(n), 如果待排序記錄集合一開始是逆序的,此時需要比較1+2+3+...(n-1) = n(n-1)/2次,並作等量級的記錄移動,因此時間複雜度爲O(n^2)。
穩定性:
冒泡排序是通過兩兩比較把小的元素往後排,大的元素往後排,所以,如果兩個元素相等,是不會交換的,所以冒泡排序是一種穩定的排序算法。