排序算法——歸併排序

原理

    當採用純歸併方法對數組進行排序時,將數組進行劃分,直到每個數組只剩下一個數字時,就停止劃分;接着,對劃分好的數組兩兩進行歸併操作;直到所有的隊列都歸併完畢,歸併排序就完成。

改進

歸併排序大多和其他排序,比如:快速排序和插入排序一同使用。即,當歸並的過程講數組劃分到一定程度的時候,採用快速排序或者插入排序,對每一個數據段進行排序,然後將排序好的數組歸併起來,這樣減少了歸併的數組劃分步驟和合並步驟,大大提高了排序的效率。

分析

歸併排序過程中有數組的劃分和歸併的過程,所以其時間複雜度是Onlog2n),其劃分數組和歸併數組的過程中,在原數組內部進行,故其空間複雜度是Onlog2n)。

C語言實現

void merge_arr(int *arr, int begin, int mid, int end)
{
    int a1_l = begin;
    int a1_r = mid;
    int a2_l = mid + 1;
    int a2_r = end;
    int *tmp = NULL;
    int i = 0, k = 0;

    if(NULL == arr || begin >= end ){
        return ;
    }

    tmp = (int *)Malloc(sizeof(int) * (end - begin + 1));
    while(a1_l <= a1_r && a2_l <= a2_r){
        if(arr[a1_l] < arr[a2_l]){
            tmp[i++] = arr[a1_l++];
        }else{
            tmp[i++] = arr[a2_l++];
        }
    }
    while(a1_l <= a1_r){
        tmp[i++] = arr[a1_l++];
    }
    while(a2_l <= a2_r){
        tmp[i++] = arr[a2_l++];
    }
    for(k = 0; k < i; ++k){
        arr[begin+k] = tmp[k];
    }
    free(tmp);
}
void part_arr(int *arr, int begin, int end)
{
    int mid = 0;

    if(NULL != arr && begin < end){
        mid = begin + ((end - begin) >> 1);
        part_arr(arr, begin, mid);
        part_arr(arr, mid+1, end);
        merge_arr(arr, begin, mid, end);
    }
}
void merge_sort(int *arr, int begin, int end)
{

    if(NULL == arr || begin >= end){
        return;
    }   
    part_arr(arr, begin, end);
}


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