C语言 归并排序

归并排序简介

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,时间复杂度为O(nlog₂n)

归并排序的模拟过程可以看链接: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);
}

猜你喜欢

转载自blog.csdn.net/fpk2014/article/details/80456469