题目描述

根据维基百科的定义:

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

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

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

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

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

输入例子:
10
3 1 2 8 7 5 9 4 6 0
1 2 3 7 8 5 9 4 6 0

输出例子:
Insertion Sort
1 2 3 5 7 8 9 4 6 0

答案

写了两个半小时,没写出归并排序(后附失败代码)。后来发现可能是我对归并排序的理解有问题。归并排序本来是一个时间复杂度没有那么高的排序方法,强行“迭代”“归并”后反而更复杂。

别人的答案写的真好,用sort就解决了

#include <algorithm>
#include <iostream>
using namespace std;
int n, a[110], s[110];
void mergesort(int(&a)[110], int s[], int n) {   //注意引用数组的写法int step = 1, flag = 1;while (flag) {                               //flag表示数组的中间步骤是否与中间数组相同flag = 0;for (int i = 0; i < n; i++) {if (a[i] != s[i])flag = 1;}step *= 2;                              //不断的归并排序,直到与中间数组相同,再排序一次并退出for (int i = 0; i < n; i += step)sort(a + i, a + min(i + step, n));        //不像插入排序一样只用一次处理。是因为判断归并的有序 区间大小比较复杂}
}
int main() {int i, j;cin >> n;for (i = 0; i < n; i++)cin >> a[i];for (i = 0; i < n; i++)cin >> s[i];for (i = 0; i < n - 1 && s[i] <= s[i + 1]; i++);  //找出中间数组的有序部分for (j = i + 1; a[j] == s[j] && j < n; j++);      //判断排序类型if (j == n) {cout << "Insertion Sort" << '\n';sort(a, a + i + 2);                      //直接用sort函数代替插入排序(注意下标)       }else {cout << "Merge Sort" << '\n';mergesort(a, s, n);}for (int i = 0; i < n; i++) {cout << a[i];if (i != n - 1) cout << " ";}return 0;
}

附:失败的归并排序
貌似10个元素的时候可以成功

#include<iostream>
#include<vector>
using namespace std;
int main()
{int n;cin >> n;vector<int> arr1;vector<int> arr2;int t;int i;for (i = 0; i < n; i++){cin >> t;arr1.push_back(t);}for (i = 0; i < n; i++){cin >> t;arr2.push_back(t);}vector<int> temp;int j1, j2;int part = 0;//第几段int curPush = 0;for (i = 1; i < n; i *= 2){part = 0;for (j1 = 0, j2 = 0; j1 < i || j2 < i; ){if ((part + 1)*i + j2 >= n){for (int t = 0; part*i + j1 + t < n; t++){temp.push_back(arr1[part*i + j1 + t]);if (temp.size() == n)break;}break;}if (arr1[part*i + j1] < arr1[(part + 1)*i + j2]){temp.push_back(arr1[part*i + j1]);curPush++;j1++;}else if (arr1[part*i + j1] >= arr1[(part + 1)*i + j2]){temp.push_back(arr1[(part + 1)*i + j2]);curPush++;j2++;}if (curPush == i * 2 - 1)//push剩下的元素{if (j1 < j2)temp.push_back(arr1[part*i + j1]);else if (j1 > j2)temp.push_back(arr1[(part + 1)*i + j2]);part += 2;j1 = 0;j2 = 0;curPush = 0;}}//复制for (int k = 0; k < n; k++){arr1[k] = *temp.begin();temp.erase(temp.begin());}}cout << endl;for (int k = 0; k < n; k++){cout << arr1[k] << " ";}cout << endl;system("pause");
}

牛客网_PAT乙级_1025插入与归并(25)相关推荐

  1. 牛客网_PAT乙级_1019. 数字黑洞 (20)

    总结 注意!! 想要在函数中结束程序,一定不要用system("pause");,因为这样只是让程序暂停,结果就是运行时间超时,无法通过所有的测试用例. 那么,C++ 程序中什么函 ...

  2. 牛客网_PAT乙级_1015反转链表 (25)【没做出来】

    题目描述 给定一个常数K以及一个单链表L,请编写程序将L中每K个结点反转.例如:给定L为1→2→3→4→5→6,K为3,则输出应该为 3→2→1→6→5→4:如果K为4,则输出应该为4→3→2→1→5 ...

  3. 牛客网_PAT乙级_1010月饼 (25)

    因为黑框框里放不下,(非官网)测试用例用txt导入: 这题有一个陷阱,官网上说给非0数,测试用例却出现了0,0吨的月饼能卖507元,而且这样的月饼要最先卖,因为它的price是inf,卖掉0吨净赚50 ...

  4. 牛客网_PAT乙级_1029有几个PAT(25)【输入字符串并strlen计算长度】

    题目描述 字符串APPAPT中包含了两个单词"PAT",其中第一个PAT是第2位§,第4位(A),第6位(T):第二个PAT是第3位§,第4位(A),第6位(T). 现给定字符串, ...

  5. 牛客网_PAT乙级_1028到底买不买(20)【用iterator迭代器,对两个vectorchar比较,删除相同元素】

    题目描述 小红想买些珠子做一串自己喜欢的珠串.卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖.于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少 ...

  6. 牛客网_PAT乙级_1027在霍格沃茨找零钱(20)

    题目描述 如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 -- 就如海格告诉哈利的:"十七个银西可(Sickle)兑一个加隆(Galleon),二十九个纳特(Knut)兑一个西可, ...

  7. 牛客网_PAT乙级_1026跟奥巴马一起编程(15)

    题目描述 美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统.2014年底,为庆祝"计算 机科学教育周"正式启动,奥巴马编写了很简 ...

  8. 牛客网_PAT乙级_10234有理数四则运算(20)【通过5/7:格式错误】

    题目描述 本题要求编写程序,计算2个有理数的和.差.积.商. 输入描述: 输入在一行中按照"a1/b1 a2/b2"的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整 ...

  9. 牛客网_PAT乙级_1023旧键盘打字(20)【别人代码里用到的hash是啥】

    心得 关于如何找到个别测试点通不过的原因: 复制别人的正确的代码,和自己的代码运行相同的测试用例,比较两者之间的区别 ??别人代码里用到的hash是啥?? 题目描述 旧键盘上坏了几个键,于是在敲一段文 ...

最新文章

  1. Python跨平台文件夹分割方法os.sep
  2. python开源聊天机器人ChatterBot——聊天机器人搭建、流程分析、源码分析
  3. 由浅入深之Jq选择器(2)
  4. Icon class生成器(Python)
  5. jquery关于多个显示隐藏
  6. Android 自定义操作成功的loading动画
  7. 日期多选插件Kalendae.js
  8. centos7查看当前端口_「Centos7开放及查看端口」- 海风纷飞Blog
  9. Asp.NET Demo
  10. 大数据分析平台建模及建议
  11. android9.0 uri,Android9.0源码学习 - Launcher Activity(一)
  12. 【C语言】在VC中使用gotoxy函数实现光标的移动
  13. word自动图文集,制表位实现公式对齐,域代码,mathtype自动公式右编号
  14. 网址导航7654推广
  15. 小柏实战学习Liunx(图文教程二十二)
  16. 74HC573的使用方法
  17. rv1126 数据流
  18. 数字转换成大写人民币
  19. 有限元方法入门:有限元方法简单的二维算例(三角形剖分)
  20. 30款android开发高效必备工具(附下载地址)

热门文章

  1. npoi 删除多行 操作excel_NPOI操作excel 2007/2010版本
  2. UVA11212Editing aBook 编辑书稿
  3. 机器学习-机器学习概论(入门机器学习基础知识)
  4. 差分约束系统之Bellman_Ford与Spfa判断负权回路
  5. 逆向工程核心原理学习笔记(九):小端序标记法2
  6. [转]I,P,B帧和PTS,DTS的关系
  7. DDD 领域驱动设计:贫血模型、充血模型的深入解读
  8. Java中已经存在了十几年的一个bug...
  9. 推荐 | 8 个 SpringBoot 精选项目
  10. 分布式链路跟踪中的 traceid 和 spanid 代表什么?