[PAT乙级]1035. 插入与归并(25)

来源:互联网 发布:软件开发方法 编辑:程序博客网 时间:2024/06/11 03:54

1035. 插入与归并(25)

原题链接
根据维基百科的定义:

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

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

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

输入格式:

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

输出格式:

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

输入样例1:103 1 2 8 7 5 9 4 6 01 2 3 7 8 5 9 4 6 0输出样例1:Insertion Sort1 2 3 5 7 8 9 4 6 0输入样例2:103 1 2 8 7 5 9 4 0 61 3 2 8 5 7 4 9 0 6输出样例2:Merge Sort1 2 3 8 4 5 7 9 0 6

思路:

  • 先判断相对简单的插入,如果不是,就是归并;
  • 根据插入排序的特征,前面部分为已排序的,后面的与原始序列是一样的。通过这个特征来判断是否是插入排序,然后不是插入排序的即为归并排序;
  • 若是插入排序则将插入排序的序列多向后排序一位即可,可以用sort函数
  • 若是归并排序,就按照归并排序的方式一步一步将a排序,排序一步就和b比较一次,若a与b相同,则多进行一步归并排序

代码:

#include <iostream>#include <algorithm>using namespace std;int cmp(int a, int b){    return a < b;}int main(){    int n;    cin >> n;    int *a = new int[n];    int *b = new int[n];    for(int i=0; i<n; i++)        cin >> a[i];    for(int i=0; i<n; i++)        cin >> b[i];    int i,j;    for(i=0; i<n-1&&b[i]<=b[i+1]; i++);//判断b有序序列最后一个元素下标    for(j=i+1; j<n; j++){//判断后面元素是否与原数组相等,若完全相同即为插入排序,否则为归并排序        if(a[j] != b[j])            break;    }    if(j == n){ // 前半部分有序而后半部分未改动可以确定是插入排序        cout << "Insertion Sort" << endl;        sort(a, a+i+2, cmp);    }else{        cout << "Merge Sort" << endl;        int k=1;//k表示步长,为1,2,4,8...        bool flag = false;        while(!flag){            flag = true;            for(int i=0; i<n; i++){//先判断是否相等,再进行归并,这样若为真的话,在后面判断则会进行一次归并结束循环                if(a[i] != b[i])                    flag = false;            }            for(int j=0; j<n; j+=k){                int temp = j+k;                if(temp>n) //若最后元素个数不足步长,则最大为N即可                    temp = n;                sort(a+j, a+temp, cmp);            }            k *= 2;//步长每次乘以2        }    }    for(int i=0; i<n-1; i++)        cout << a[i] << " ";    cout << a[n-1];    delete []a;    delete []b;    return 0;}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝卖家发货选错在线下单怎么办 申请退款后卖家又虚假发货了怎么办 公司用淘宝没发票做账怎么办 淘宝网买了假货确认了怎么办? 吃了安眠药睡了一天还没有醒怎么办 淘宝买的东西退货快递弄丢了怎么办 在淘宝上已付钱店家说没货了怎么办 从淘宝物流寄东西到国外被扣怎么办 不是天猫的淘宝卖家不发货怎么办 微店违规说卖假冒商品怎么办 云集微店的商品没货了怎么办 淘宝买家被检测有虚拟交易怎么办 媒体声音突然没有声音了该怎么办 华为微信运动步数为零怎么办 淘宝店铺没货了客户拍了怎么办 房子涨价了卖家反悔不卖了怎么办 买的东西很贵质量不好怎么办 在淘宝开的店账号忘了怎么办 建了个淘宝优惠券群没人购物怎么办 刚开的淘宝店没有生意怎么办 房产代理公司不给渠道结佣金怎么办 天猫超过72小时不发货怎么办 流量魔盒苹果下载怎么打不开怎么办 淘宝包邮店铺新疆地区拍怎么办 淘宝客服当顾客要优惠时怎么办 微信手机号注册的找不到了怎么办 之前注册的微信找不到了怎么办 苹果ipad的id密码忘了怎么办 淘宝和支付宝用一张银行卡怎么办 淘宝卖家填写虚假物流信息怎么办 淘宝店铺的浏览量越来越少怎么办 网上充手机话费充错了怎么办 夜神模拟器上陌陌的位置不对怎么办 如果在大庭广众之下放了个屁怎么办 淘宝分销上传宝贝被系统下架怎么办 酷狗喜欢歌单里面的歌都没了怎么办 苹果手机下载不了微信缓冲怎么办 登陆微信提示版本过低登不了怎么办 苹果手机微信版本过低登不上怎么办 微信小程序显示微信版本过低怎么办 三星手机登微信显示版本过低怎么办