排序算法——冒泡排序(C語言實現)

  原理

   其原理是從亂序數組中的第一個位置的數據開始,讓其與相鄰的數字比較,如果相鄰數字比該數字小(或大,這根據你想要升序結果還是降序結果決定),就交換兩個位置,依次向後比較交換,知道數組最後。一輪結束以後,最大(或最小)的數字會被放在最後一個位置,再重複上述冒泡過程一輪,則第二大(或小)數字被放在了倒數第二個位置,這樣反覆進行n次(n表示數組的長度),冒泡排序過程結束。

複雜度分析

冒泡的時間複雜度是On2),因爲在最壞的情況下,每個數據都會被遍歷nn爲數組長度)次;空間複雜度是O1),因爲其在原數組的基礎上將兩個數字交換,並沒有向系統申請多餘空間。

改進

原始冒泡每次排序都要將每個數字遍歷n次,有這麼一種情況,數組本身就近於有序,本來可以冒泡一次就可以排好序,原始冒泡要求需要冒泡n次。改進冒泡原理如下,我們可以用一個flag記錄遍歷的過程,若有交換動作,就認爲排序未結束;若沒有交換動作,則認爲數組有序,不需要遍歷,直接退出循環。

C語言實現(改進冒泡)

void *Malloc(size_t size)
{
    void *rst = malloc(size);
    if(NULL == rst){
        fprintf(stderr, "Over flow!\n");
    }
    return rst;
}
void swap(void *a, void *b, int size)
{
    void *tmp = Malloc(size);
    memcpy(tmp, a, size);
    memcpy(a, b, size);
    memcpy(b, tmp, size);
    free(tmp);
}
Boolean bubble(int *arr, int arrlen)
{
    int i = 0, j= 0;  
    int sort_ok = TRUE; // user a flag to record if the array is sort ok.

    if(NULL == arr || 0 >= arrlen){
        printf("Invalid input arr...\n");
        return FALSE;
    }   
    for(i = 0; i < arrlen; ++i){
        sort_ok=TRUE;
        for(j = 1; j < arrlen; ++j){
            if(arr[j] < arr[j - 1]){
                swap(&arr[j], &arr[j-1], sizeof(arr[0]));
                sort_ok = FALSE;
            }   
        }   
        if(TRUE == sort_ok){
            break;
        }    
    }
}



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