算法之冒泡排序【C語言】

冒泡排序(從小到大)

算法思想:遍歷一n個數據的數組,比較相鄰數據的大小,把小值放前面,大值放後面,比較數次後,該組數據由小到大排列。假設最小值在最後一個位置,則須經過n-1次才能把最小值交換到第一位,即比較次數最多爲n-1次。

對於內循環的循環不變式

初始化:第一次遍歷前,in_index之前沒有值,顯然滿足小值在前,大值在後;

保持:第k次遍歷前,in_index = k,在k之前的值均保持小值在前,大值在後;

終止:遍歷n-1次後,比較了所有數據,循環結束,

對於外循環的循環不變式

初始化:第一次遍歷前,out_index之前沒有對數據進行任何操作,即排序後的數據爲空,顯然滿足相鄰之間小值在前,大值在後;

保持:第k次遍歷前,out_index = k,由於內循環的循環不變式,可以證明經過k-1次的操作,數據滿足相鄰之間小值在前,大值在後;

終止:遍歷n-1次,可以保證每一位數據均與另外n-1個數據進行了比較並進行了交換,循環結束。

最壞時間複雜度:O(n2)

代碼如下:

#include <stdio.h>
#define MAXSIZE 10

void print(int array[]);
void bubble_sort(int array[]);

/**
 * 打印程序
 */
void print(int array[])
{
    int index = 0;
    while(index < MAXSIZE)
    {
        printf("%d ", array[index]);
        index ++;
    }
    printf("\n");
}

/**
 * 冒泡排序,從小到大排序
 */
void bubble_sort(int array[])
{
    int out_index = 0;//外部循環變量
    int in_index = 0;//內部循環變量
    int tmp_value = 0;//臨時存儲變量

    while(out_index < (MAXSIZE-1))//外部循環
    {
        in_index = MAXSIZE - 1;
        while(in_index > out_index)//內部循環
        {
            if(array[in_index - 1] >  array[in_index])//相鄰變量比較,如果後一個小於前一個,交換
            {
                tmp_value = array[in_index];
                array[in_index] = array[in_index - 1];
                array[in_index - 1] = tmp_value;
            }
            in_index --;
        }
        out_index++;
    }
}
/**
 * 主程序
 */
int main()
{
    int array[MAXSIZE] = {4,-2,2,0,-1,3,5,1,4,7};//待排序的數組

    printf("Oringin array: ");
    print(array);

    bubble_sort(array);

    printf("Sort array: ");
    print(array);

    return 0;
}

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