归并排序

主要思想为:将待排数组不断划分成更小的区间(递归),直到剩下一个元素,然后返回,然后将左右各返回的一个元素(一共两个)进行合并。合并时的算法就是将两个有序数组合为一个,而递归的尽头只剩下一个元素时,他自身就可看为是有序的。所以每次返回的都是两个有序数组,再合并成一个有序的再返回……

#include <stdio.h>

void Merge(int a[],int start,int end)
{
    int mid=(start+end)/2;
    int b[end-start];
    int i,j,k;
    i=start;
    j=mid;
    k=0;
    while(i<mid||j<end)
    {
        //1、i没完 j完了 
        //2、i j都没完 但是a[i]<a[j] 
        if(j==end||i<mid&&a[i]<a[j])  //i<mid 是“i完了j没完时加的条件” 
        b[k++]=a[i++];
        //1、i完了 j没完
        //2、i j都没完 但是a[i]<a[j]不成立 
        else
        b[k++]=a[j++];
    }
    //copy back 
    for(i=start,j=0;j<k;)
    a[i++]=b[j++];
}

void MergeSort(int a[],int left,int right)
{
    //保证元素个数>1 
    if(right-left>1)
    {
        int mid=(right+left)/2;
        MergeSort(a,left,mid);
        MergeSort(a,mid,right);
        Merge(a,left,right);
    }
}

int main(void)
{
    int a[9]={5,3,6,2,1,4,7,8,9};
    int i;
    MergeSort(a,0,9);
    for(i=0;i<9;i++)
    printf("%d\t",a[i]);
    return 0;
}

事件复杂度:o(nlogn) (最好最坏一样)稳定

点赞