冒泡排序

冒泡排序算法演示鏈接


排序思想

      依次比較相鄰的兩個記錄的關鍵字,若兩個記錄是反序的(即前一個記錄的關鍵字大於後前一個記錄的關鍵字),則進行交換,直到沒有反序的記錄爲止。
① 首先將L->R[0]與L->R[0]的關鍵字進行比較,若爲反序(L->R[0]的關鍵字大於L->R[1]的關鍵字),則交換兩個記錄;然後比較L->R[1]與L->R[2]的關鍵字,依此類推,直到L->R[n-2]與L->R[n-1]的關鍵字比較後爲止,稱爲一趟冒泡排序,L->R[n-1]爲關鍵字最大的記錄。

②  然後進行第二趟冒泡排序,對前n-1個記錄進行同樣的操作。
     一般地,第i趟冒泡排序是對L->R[1 … n-i+1]中的記錄進行的,因此,若待排序的記錄有n個,則要經過n-1趟冒泡排序才能使所有的記錄有序。

排序示例

設有9個待排序的記錄,關鍵字分別爲23, 38, 22, 45, 23, 67, 31, 15, 41,冒泡排序的過程如圖1所示。

算法實現

#define FALSE 0
#define TRUE 1

void Bubble_Sort(int value[], int length)
{
    int i, j, flag;
    int tmp = 0;
    for(i=0; i<length; i++)       /*   共有n-1趟排序   */
    {
        flag = TRUE;
        for(j=1; j<length - i; j++)   /*   一趟排序   */
            if(value[j-1] < value[j])
            {
                flag = FALSE;
                tmp = value[j];
                value[j] = value[j-1];
                value[j-1] = tmp;
            }
        if(flag == TRUE)
            break;
     }
}

算法分析

時間複雜度
◆  最好情況(正序):比較次數:n-1;移動次數:0;
◆  最壞情況(逆序):

比較次數:

                     

移動次數:

                    

故時間複雜度:T(n) = O(n²)
空間複雜度:S(n) = O(1)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章