7-11 二路归并排序

给定一个整数序列,请按非递减序输出采用二路归并排序(递归法)的各趟排序后的结果(每完成一次归并操作就输出归并后的结果)。

输入格式:

测试数据有多组,处理到文件尾。每组测试数据第一行输入一个整数n(1≤n≤100),第二行输入n个整数。

输出格式:

对于每组测试,输出若干行,每行是一趟排序后的结果,每行的每两个数据之间留一个空格。

输入样例:

6
73 12 27 98 81 64
 

输出样例:

12 73 27 98 81 64
12 27 73 98 81 64
12 27 73 81 98 64
12 27 73 64 81 98
12 27 64 73 81 98


#include<iostream>
using namespace std;
int a[110];
int n;
int a1=0;
void Merge (int a[],int t[],int low ,int mid ,int high){
    int i=low,j=mid+1,k=low;
    while (i<=mid&&j<=high){//将L.r中记录从小到大存入a
        if(a[i]<a[j]) 
            t[k++]=a[i++];
        else
            t[k++]=a[j++];
    }
    while (i<=mid) 
        t[k++]=a[i++];//将剩余的L.r[i..mid]存入a
    while (j<=high) 
        t[k++]=a[j++];//将剩余的L.r[j..high]存入a

    while(low<=high){
        a[low]=t[low];
            low++;
    }
}
void prints(int s[],int n){
    int t=0;
    for(t=0;t<n;t++){
        printf("%d",s[t]);
        if(t==n-1){
            printf("\n");
        }else{
            printf(" ");
        }
    }
}
void MSort (int a[],int t[],int low ,int high){
    //L.r[low..high]归并排序后存入L.r[low..high]中
    if(low<high){
        int mid=(low+high)/2;//将当前序列一分为二
        MSort(a,t,low,mid);//将序列L.r[low..mid]递归归并排序结果放入L.r[low,mid]
        MSort(a,t,mid+1,high);//将L.r[mid+1..high]递归归并排序结果放入L.r[mid+1..high]
        Merge(a,t,low,mid,high);//将L.r[low..mid]和L.r[mid+1,high]归并到L.r[low..high]
        prints(a,n);
        
    }
}
int main(){
   while(~scanf("%d",&n))
    //输入序列
   {for(int i=0;i<n;i++){
        //cin>>a[i];
        scanf("%d",&a[i]);
    }
    int t[n];
    MSort(a,t,0,n-1);//参数传入范围为0-length-1
    /*for(int i=0;i<=s.length-1;i++){
        cout<<s.r[i]<<" ";
    }*/
   }
    return 0;
}

 

posted @ 2023-06-26 21:51  一个小虎牙  阅读(111)  评论(0编辑  收藏  举报