问题描述:
输入:待排序列r[n],待排区间[s,t];
输出:升序序列r[s]~r[t];
分析:
1:划分;
2:求解子问题;
3:合并;
归并排序首先执行划分过程,直到子序列长度为1,再在回溯的过程中排序。在merge_()函数中,由于回溯回来的两个子序列已经有序,所以只需依次取出两者中最小值中的较小者即可。
#include <iostream>
using namespace std;
void Mergesort(int r[],int s,int t);
void merge_(int r[],int s,int m,int t);
int r[10010],r1[10010];
int main()
{
int n,i;
cin>>n;
for(i=0;i<n;i++)
cin>>r[i];
Mergesort(r,0,n-1);
for(i=0;i<n;i++)
cout<<r[i]<<" ";
cout<<endl;
return 0;
}
void Mergesort(int r[],int s,int t)
{
if(s == t)
return ;
else
{
int m = (s+t)/2;
Mergesort(r,s,m);
Mergesort(r,m+1,t);
merge_(r,s,m,t);
for(int i=s;i<=t;i++)
r[i] = r1[i];
}
}
void merge_(int r[],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++];
else
r1[k++]=r[j++];
}
while(i<=m)
r1[k++]=r[i++];
while(j<=t)
r1[k++]=r[j++];
}