PAT1035—— 插入与归并

根据维基百科的定义:

插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。

归并排序进行如下迭代操作:首先将原始序列看成N个只包含1个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下1个有序的序列。

现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法?

输入格式:

输入在第一行给出正整数N (<=100);随后一行给出原始序列的N个整数;最后一行给出由某排序算法产生的中间序列。这里假设排序的目标序列是升序。数字间以空格分隔。

输出格式:

首先在第1行中输出“Insertion Sort”表示插入排序、或“Merge Sort”表示归并排序;然后在第2行中输出用该排序算法再迭代一轮的结果序列。题目保证每组测试的结果是唯一的。数字间以空格分隔,且行末不得有多余空格。

输入样例1:

10
3 1 2 8 7 5 9 4 6 0
1 2 3 7 8 5 9 4 6 0

输出样例1:

Insertion Sort
1 2 3 5 7 8 9 4 6 0

输入样例2:

10
3 1 2 8 7 5 9 4 0 6
1 3 2 8 5 7 4 9 0 6

输出样例2:

Merge Sort
1 2 3 8 4 5 7 9 0 6

一个测试点没有过,不知道如何修改,用了投机的方法,在归并排序的过程里用了sort……如果是递归好像不容易把每次迭代的结果直接看出来。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cctype>
#include <cstdlib>
#include<cmath>
#include <string>
#include <map>
#include <set>
#include <queue>
#include <vector>
#include <stack>
#include <cctype>
using namespace std;
typedef unsigned long long ull;
#define INF 0xfffffff

int s1[101],s2[101],a[101],flag,n;

int is()
{
    int i,j,k;
    for(i=2;i<=n;++i)
    {
        if(a[i]<a[i-1])
        {
            a[0]=a[i];
            a[i]=a[i-1];
            for(j=i-2;a[0]<a[j];--j)
            {
                a[j+1]=a[j];
            }
            a[j+1]=a[0];
            for(k=1;k<=n;++k)
            {
                if(a[k]!=s1[k])
                    break;
            }
            if(flag)
            {
                for(k=1;k<=n;++k)
                {
                    s2[k]=a[k];
                }    
                return 1;            
            }
            if(k==n+1)
                flag=1;
        }
    }
    return 0;
}

int ms()
{

    int i,j,k; 
    for(i=1;i<=2*n;i*=2)
    {
            j=1;
            while(1)
            {
                if(j+i>=n)
                {
                    sort(a+j,a+n+1);
                    break;
                }
                sort(a+j,a+j+i);
                j=j+i;
            }
            for(k=1;k<=n;++k)
            {
                if(a[k]!=s1[k])
                    break;
            }
            if(flag)
            {
                for(k=1;k<=n;++k)
                {
                    s2[k]=a[k];
                }    
                return 1;            
            }
            if(k==n+1)
                flag=1;        
    }
    return 0;
}

int main()
{ 
    int x,y,i,j,k,ans;
    
    while(cin>>n)
    {    
        flag=0;
        for(i=1;i<=n;++i)
        {
            cin>>s2[i];
        }
        for(i=1;i<=n;++i)
        {
            a[i]=s2[i];
        }        
        for(i=1;i<=n;++i)
        {
            cin>>s1[i];
        }
        if(ms())
        {
            cout<<"Merge Sort"<<endl;
            cout<<s2[1];
            for(i=2;i<=n;++i)
                cout<<" "<<s2[i];
            cout<<endl;
        }    
        else
        {
            for(i=1;i<=n;++i)
            {
                a[i]=s2[i];
            }
            is();                
            cout<<"Insertion Sort"<<endl;
            cout<<s2[1];
            for(i=2;i<=n;++i)
                cout<<" "<<s2[i];
            cout<<endl;            
        }

    }
    return 0;
}
原文地址:https://www.cnblogs.com/Traveller-Leon/p/4989769.html