C語言 歸併排序

歸併排序簡介

歸併排序(MERGE-SORT)是建立在歸併操作上的一種有效的排序算法,該算法是採用分治法(Divide and Conquer)的一個非常典型的應用,時間複雜度爲O(n(logn)^2)O(nlogn)

歸併排序的模擬過程可以看鏈接:MergeSortion

實現過程

爲了比較容易地理解插入排序,我們可以列出一組數據,比如:
1,5,4,3,7,6

歸併排序很好理解,簡單示意:
這裏寫圖片描述

實現分治之後,再實現合併操作,整個過程就完成了。

代碼實現

首先是分治部分的實現:

int length = high - low;
for (int i = length / 2; i > 0; i = i / 2) {
    mergeSort(a, low, low + i);
    mergeSort(a, high - i, high);
    _merge(a, low, i, high);
}

完整的代碼實現:

#include <stdio.h>

void print(const int *a, const int length) {
    int i;
    for (i = 0; i<length; i++) {
        printf("%d ", a[i]);
    }
    putchar('\n');
}

void _merge(int *a, int low, int mid, int high) {
    //合併兩個有序隊列
    for (int i = 0; i < mid; i++) {
        for (int j = mid; j < high; j++) {
            if (a[i] > a[j]) {
                exchange(a, i, j);
            }
        }
    }
}


void mergeSort(int *a, const int low, const int high) {
    if (low < high) {
        int length = high - low;
        if (length == 1) {
            if (a[low] > a[high])
                exchange(a, low, high);
        }
        for (int i = length / 2; i > 0; i = i / 2) {
            mergeSort(a, low, low + i);
            mergeSort(a, high - i, high);
            _merge(a, low, i, high);
        }
    }
}


void main() {
    const int length = 5;
    int my_array[5] = {1,3, 5,2,5};

    mergeSort(my_array, 0, length-1);
    print(my_array, length);
}
發佈了33 篇原創文章 · 獲贊 13 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章