您的位置:首页 > 其它

分治法-归并排序

2014-03-28 20:34 169 查看
问题:应用归并法对一个记录序列进行升序排序(利用分治法)

思路:1.划分

      2.求解子问题

      3.合并

归并排序的执行过程:(*是拆分,#是合并)

     8  3  2  6  7  1  5  4

  *8 3 2 6*         *7 1 5 4*

*8 3*  *2 6*      *7 1*  *5 4*

*8* *3* *2* *6*  *7* *1* *5* *4*

#3 8#   #2 6#    #1 7#   #4 5#

#2 3 6 8#           #1 4 5 7#

    1  2  3  4  5  6  7  8

如果还不理解什么是“归并排序”,请查看百度百科或者《数据结构》

这里不再多说,主要实现分治的解决方法

实现代码:(数据上限:n<=1000)

#include<stdio.h>
int r[1010];
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]h和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)//对序列r[s]~r[t]进行归并排序
{
int i,m,r1[1010];
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);//合并两个有序子序列,结果保存在数组r1中
for(i=s;i<=t;i++)//将有序序列传回r中
r[i]=r1[i];
}
}
int main()
{
int i,j,n,m;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&r[i]);
MergeSort(r,0,n-1);
for(i=0;i<n;i++)
printf("%d ",r[i]);
puts("");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: