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