归并排序分治策略的典型题目;
这题相对比较简单主要通过递归调用,吧问题分而治治;
首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可
#include<stdio.h>
void merge(int r[],int r1[],int s,int m,int t) //合并子序列
{
int i=s,j=m+1,k=s;
while(i<=m&&j<=t)
{
if(r[i]<=r[j]) r1[k++]=r[i++]; //取r[i],r[j]中的较小者放入r1[k]
else r1[k++]=r[j++];
}
while(i<=m) //进行收尾
{
r1[k++]=r[i++];
}
while(j<=t)
{
r1[k++]=r[j++];
}
}
void mergesort(int r[],int s,int t)
{
int m,r1[1000];
if(s==t) return;
else{
m=(s+t)/2;
mergesort(r,s,m); //子问题1
mergesort(r,m+1,t); //子问题2
merge(r,r1,s,m,t); //合并子序列
for(int i=s;i<=t;i++)
{
r[i]=r1[i];
}
}
}
int main()
{
int r[]={9,8,7,6,5,4,3,2,1};
mergesort(r,0,8);
for(int i=0;i<9;i++)
printf("%d ",r[i]);
}