归并排序

来源:互联网 发布:javascript的数据类型 编辑:程序博客网 时间:2024/06/03 09:42

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

#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) (最好最坏一样)稳定

原创粉丝点击