归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。
//归并排序 递归法
void memeryArray(int *a,int first,int mid,int last,int *temp)//将有序数列合并
{
int i=first,j=mid+1;
int m=mid,n=last;
int k=0;
while(i<=m&&j<=n)
{
if(a[i]<a[j])
{
temp[k++]=a[i++];
}
else
{
temp[k++]=a[j++];
}
}
while(i<=m)
{
temp[k++]=a[i++];
}
while(j<=n)
{
temp[k++]=a[j++];
}
for(i=0;i<k;i++)
{
a[first+i]=temp[i];
}
}
//把数组分成有序数列
void megerSort(int *a,int first,int last,int *temp)
{
if(first<last)
{
int mid=(first+last)>>1;
megerSort(a,first,mid,temp);//左边有序
megerSort(a,mid+1,last,temp);//右边有序
memeryArray(a,first,mid,last,temp);
}
}
bool Meger(int *a,int n)
{
int *p=(int *)malloc(n*sizeof(int));
if(p!=NULL)
{
megerSort(a,0,n-1,p);
}
else
{
return false;
}
return true;
}
int main()
{
int a[]={9,8,7,6,5,4,3,21,10,27};
bool flag=Meger(a,10);
for(int i=0;i<10;i++)
{
printf("%d ",a[i]);
}
return 0;
}