分治算法-归并排序

来源:互联网 发布:中国网络黑市 编辑:程序博客网 时间:2024/05/12 23:38

问题描述:
输入:待排序列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++];}
1 0