zoukankan      html  css  js  c++  java
  • pat 1035 插入与归并

    • 1035 插入与归并 (25 分)
     

    根据维基百科的定义:

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

    归并排序进行如下迭代操作:首先将原始序列看成 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 <algorithm>
    using namespace std;
    
    
    int N;
    int s[105],c[105],t[105];//原数组,当前数组,用于拷贝的数组
    int insert_sortt = 0;//是否是插入排序
    int merge_sortt = 0;//是否是归并排序
    bool judge(){ //判断两个数组是否相等
        for(int i = 0;i<N;i++){
            if(c[i]!=t[i]) return false;
        }
        return true;
    }
    
    bool insert_sort(){ //插入排序
        int times = 0;
        for(int i = 0;i<N;i++) t[i] = s[i];//拷贝
        for(int i = 1;i<=N && times<1;i++){
            sort(t,t+i);
            if(insert_sortt) times++; //因为还要往下迭代一次
            if(judge()) insert_sortt = 1;//判断
        }
        return insert_sortt;
    }
    
    bool merge(){
        int times = 0;
        for(int i = 0;i<N;i++) t[i] = s[i];
        for(int i = 2;i<=N && times<1;i*=2){ //归并的规模,每次x2
            for(int j = 0;j<N;j+=i){
                int l = j;
                int r = j+i<N?j+i:N;//处理边界问题
                sort(t+l,t+r);
            }
            if(merge_sortt) times++;
            if(judge()) merge_sortt = 1;
        }
        return merge_sortt;
    }
    
    int main(){
        cin>>N;
        for(int i = 0;i<N;i++) cin>>s[i]; //输入
        for(int i = 0;i<N;i++) cin>>c[i];
    
        if(insert_sort()|| merge()) //如果是插入排序,就不用进行归并排序了。
            ;
        if(insert_sortt == 1) cout<<"Insertion Sort"<<endl;//以下是输出
        if(merge_sortt == 1) cout<<"Merge Sort"<<endl;
        for(int i = 0;i<N;i++){
            cout<<t[i];
            if(i!=N-1) cout<<" ";
        }
        return 0;
    }
    
    
  • 相关阅读:
    在线预览Office文档
    花生壳内网穿透
    Net core跨域
    EF链表查询
    Python冒泡排序、选择排序、插入排序、希尔排序、归并排序
    竟然可以这样学python!
    如何使用python打印9乘9乘法口诀表?
    python爬取小视频
    —用python写PDF转换器
    从0到1搭建个人博客-Django(三)
  • 原文地址:https://www.cnblogs.com/bigbrox/p/11420856.html
Copyright © 2011-2022 走看看