1. 程式人生 > >排序算法(1)——冒泡排序

排序算法(1)——冒泡排序

除了 分析 .... sqli span als 排序。 lag AS

冒泡排序

冒泡排序可以說是最簡單的一種排序,當然,復雜度也是最高的

冒泡排序的實現過程:兩兩之間相互比較,當前者比後者大的時候,兩者交換(假設是升序排列)。

那麽給出簡單的冒泡排序算法:

#define MAXSIZE 10
void
swap(SqList *L, int i, int j) { int temp = L->r[i]; L->r[i] = L->r[j]; L->r[j] = temp; } typedef struct { int r[MAXSIZE + 1]; int length; } SqList; void
BubbleSort0(SqList *L) { int line, col; for (line = 0; line < L->length - 1; line++) { for (col = line + 1; col < L->length; col++) { if (L->a[line] > L->a[col]) { swap(L, line, col) } } }

這是最簡單的一種排序算法,也是我們所能夠寫出來的,不正宗的冒泡排序。

下面給出一種正宗的冒泡排序:

void BubbleSort1(SqList *L)
{
    int line, low;
    for (line = 0; line < L->length - 1; line++)
    {
        for (low = L->length - 1; low >= line; low--)
        {
            if (L->r[low] > L->r[low + 1])
            {    
                swap(L, line, low);
            }
        }
    }
}

顯然,這種排序算法相較於上一種就好了很多,後面的數據經過比較逐漸的浮上(前)來,並且稍微小一點的(比浮上來的第一個略大)的數據也經過這次排序而浮到前面上來。而上一種是每一個與其後面的每一個都進行一次對比。

冒泡排序還能不能改進呢?

答案是能。

設想一下:如果沒有數據交換或者數據交換很少的話,會是怎樣的一種情況?

比方說 {2, 1, 3, 4, 5, 6, 7, 8, 9},對它進行排序,顯然,除了1 和 2交換之外,沒有其他的數據進行交換,但是如果沿用上面的算法,盡管不用進行數據交換,我們還是要進行for循環,將兩兩之間進行比較(畢竟計算機不知道這個數組到底有沒有序)。那麽,我們就可以想一個改進方法,如果沒有數據交換,就不進行比較。

具體改進代碼如下:

void BubbleSort2(SqList *L)
{
    int line, col;
    bool flag = True;
    for (line = 0; line < L->length - 1 && flag; line++)
    {
        flag = False;
        for (col = L->length - 1; col >= line ; low--)
        {
            if (a[col] > a[col + 1])
            {
                swap(L, col, col + 1);
                flag = True;      //如果有數據交換,那麽flag 就為真,如果沒有,就為假
            }
        }
    }
}

以上。

先寫這麽點。。

因為舍友太過吵鬧無法入睡,所以才寫的。。。

真尼瑪悲傷。。

差點忘了復雜度分析:

這個算法的復雜度是O(n^2),具體分析如下:

最糟的狀況,就是原排序和我們所要的排序完全相反,比如說我們要的是{1, 2, 3, 4, 5},而原來的數列卻是{5, 4, 3, 2, 1},那麽這樣的話,每一步比較都需要換位,第一次需要比較並移動4次,第二個需要比較並移動3次,第三個需要比較並移動兩次,第四個需要比較並移動1次,總共是10次,也就是 (n - 1) + (n - 2) + (n - 3) + ......+ 1 = n(n - 1) / 2。

而最好的情況,當然是一次都不用移動啦,這個時候算法復雜度就是O(n)。

排序算法(1)——冒泡排序