算法——归并排序

       归并排序是分治法的一个典型应用,即将已有序的序列合并为一个有序的序列。如果将两个已有序的序列合并为一个有序的序列,则称为二路归并。时间复杂度为O(nlogn)。是稳定的排序算法。

       以下为二路归并排序的例子:

算法——归并排序

       以下为二路归并的Demo:

#include<stdio.h>

void Merge(int a[], int b[], int s, int e, int mid)
{
    int i = s, j = mid + 1, k = 0;

    while(i <= mid && j <= e)
    {
        if(a[i] < a[j])
            b[k++] = a[i++];
        else
            b[k++] = a[j++];
    }

    while(i <= mid)
        b[k++] = a[i++];
    while(j <= e)
        b[k++] = a[j++];

    for(i = 0; i < k; ++i)
        a[s + i] = b[i];
}

void MergeSort(int a[], int b[], int s, int e)
{
    if(s < e)
    {
        int mid = (s + e) / 2;
        MergeSort(a, b, s, mid);	       //归并排序前半部分
        MergeSort(a, b, mid + 1, e);    //归并排序后半部分
        Merge(a, b, s, e, mid);		    //合并为一个有序序列
    }
}

int main()
{
    int a[8] = {3, 5, 2, 7, 4, 1, 6, 8};
    int b[8];
    int n = 8;

    MergeSort(a, b, 0, n - 1);

    int i;
    for(i = 0; i < n; ++i)
        printf("%d ", a[i]);
    printf("\n");

    return 0;
}


你可能感兴趣的:(算法,归并排序)