PAT (Basic Level) Practise (中文)-1035. 插入与归并(25)
PAT (Basic Level) Practise (中文)-1035. 插入与归并(25) http://www.patest.cn/contests/pat-b-practise/1035
根据维基百科的定义:
插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。
归并排序进行如下迭代操作:首先将原始序列看成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 此题的一大坑儿是:定义的边界理解-需要很严肃地抠词儿,哈哈哈哈哈。。。先看定义:
插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。
归并排序进行如下迭代操作:首先将原始序列看成N个只包含1个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下1个有序的序列。
现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法? 分析:插入排序:将当前处理的元素‘插入’到前一步的‘有序’序列中-》如果要插入的有序子序列的元素个数为0,则并不叫插入,所以i=0不满足-》所以,要从i=1开始,因为第0个元素就是一个有序子序列。
‘中间’序列:先处理,再匹配。
当时被插入排序的‘i=0’和'i=1'在定义上的区别坑得死去活来。。。
#include<cstdio> void Insertion(int *num,int k,int len)
{
if(k>=len) k=len-;
int temp=num[k];
for(int i=k-;i>=;i--)
{
if(num[i]>temp) num[i+]=num[i],num[i]=temp;
else
break;
}
} void Merge(int *num,int k,int len)
{
if(k>=len) k=len;
int start=,end=;
for(int i=;i<len;)
{
start=i;
end=(start+k>len?len:start+k);
for(int m=end-;m>=start;m--)
{
int iloc=-,max=num[start],l=;
for(l=start;l<=m;l++) if(num[l]>=max) iloc=l,max=num[l];
if(iloc>=) num[iloc]=num[l-],num[l-]=max;
}
i+=k;
}
} int match(int *num0,int *num3,int len)
{
for(int i=;i<len;i++)
if(num0[i]!=num3[i]) return ;
return ;
} int main()
{
int n=;
int num[]={}; // 原数据
int num0[]={}; // 处理后
int num1[]={}; scanf("%d",&n);
for(int i=;i<n;i++) scanf("%d",&num[i]);
for(int i=;i<n;i++) scanf("%d",&num0[i]); for(int i=;i<n;i++) num1[i]=num[i];
for(int i=;i<n;i++)
{
Insertion(num1,i,n);
if(match(num0,num1,n))
{
printf("Insertion Sort\n");
Insertion(num1,i+,n);
for(int j=;j<n;j++)
{
if(j==n-) printf("%d",num1[j]);
else printf("%d ",num1[j]);
}
return ;
}
} for(int i=;i<n;i++) num1[i]=num[i];
for(int i=;;)
{
Merge(num1,i,n);
if(match(num0,num1,n))
{
printf("Merge Sort\n");
Merge(num1,i*,n);
for(int j=;j<n;j++)
{
if(j==n-) printf("%d",num1[j]);
else printf("%d ",num1[j]);
}
return ;
}
i*=;
if(i>*n) break;
} return ;
}
PAT (Basic Level) Practise (中文)-1035. 插入与归并(25)的更多相关文章
- PAT (Basic Level) Practise (中文)-1039. 到底买不买(20)
PAT (Basic Level) Practise (中文)-1039. 到底买不买(20) http://www.patest.cn/contests/pat-b-practise/1039 小红 ...
- PAT (Basic Level) Practise (中文)- 1022. D进制的A+B (20)
PAT (Basic Level) Practise (中文)- 1022. D进制的A+B (20) http://www.patest.cn/contests/pat-b-practise/1 ...
- PAT (Basic Level) Practise (中文)- 1024. 科学计数法 (20)
PAT (Basic Level) Practise (中文)- 1024. 科学计数法 (20) http://www.patest.cn/contests/pat-b-practise/1024 ...
- PAT (Basic Level) Practise (中文)-1025. 反转链表 (25)
PAT (Basic Level) Practise (中文)-1025. 反转链表 (25) http://www.patest.cn/contests/pat-b-practise/1025 ...
- PAT (Basic Level) Practise (中文)- 1026. 程序运行时间(15)
PAT (Basic Level) Practise (中文)- 1026. 程序运行时间(15) http://www.patest.cn/contests/pat-b-practise/10 ...
- PAT (Basic Level) Practise (中文)-1027. 打印沙漏(20)
PAT (Basic Level) Practise (中文)-1027. 打印沙漏(20) http://www.patest.cn/contests/pat-b-practise/1027 本题 ...
- PAT (Basic Level) Practise (中文)-1028. 人口普查(20)
PAT (Basic Level) Practise (中文)-1028. 人口普查(20) http://www.patest.cn/contests/pat-b-practise/1028 某 ...
- PAT (Basic Level) Practise (中文)-1029. 旧键盘(20)
PAT (Basic Level) Practise (中文)-1029. 旧键盘(20) http://www.patest.cn/contests/pat-b-practise/1029 旧键盘上 ...
- PAT (Basic Level) Practise (中文)-1030. 完美数列(25)
PAT (Basic Level) Practise (中文)-1030. 完美数列(25) http://www.patest.cn/contests/pat-b-practise/1030 给 ...
随机推荐
- 序列化框架MJExtension详解 + iOS ORM框架
当开发中你的模型中属性名称和 字典(JSON/XML) 中的key 不能一一对应时, 或者当字典中嵌套了多层字典数组时..., 以及教你如何用 MJExtension 配置类来统一管理你的模型配置, ...
- 简单介绍Git两种拉取代码的方式
first: 1.通过git clone 命令克隆git库中的项目 注意:通过 git clone方式克隆的代码会在服务器上自动建一个与git库名相同的文件夹,所以有两种思路,第一种就是直接在wwwr ...
- POJ3264 【RMQ基础题—ST-线段树】
ST算法Code: //#include<bits/stdc++.h> #include<cstdio> #include<math.h> #include< ...
- OpenGL Geometry Shader
http://blog.csdn.net/bugrunner/article/details/5455324 Geometry Shader可以处理Vertex Shader和Fragment Sha ...
- C#获得当前执行的函数名、当前代码行、源代码文件名
http://blog.csdn.net/newegg2009/article/details/6220385 C#获得当前执行的函数名.当前代码行.源代码文件名 [日期:2010-10-18 11: ...
- Cocos2d-x-html5之HelloWorld深入分析与调试
Cocos2d-x-html5之HelloWorld深入分析与调试 另:本章所用Cocos2d-x版本为: Cocos2d-html5-v2.1.1 http://cn.cocos2d-x.org/d ...
- MySQL 派生表(Derived Table) Merge Optimization
本文将通过演示告诉你:MySQL中派生表(Derived Table)是什么?以及MySQL对它的优化. Background 有如下一张表: mysql> desc city; +------ ...
- 用C#编写计算器
零有点问题,而且目前只能做一些简单的运算,+.-.*./.平方.开根号 希望有大佬指正我的错误 感谢 using System;using System.Collections.Generic;usi ...
- sql server 2012 导出sql文件
导出表数据和表结构sql文件 在工作中,经常需要导出某个数据库中,某些表数据:或者,需要对某个表的结构,数据进行修改的时候,就需要在数据库中导出表的sql结构,包括该表的建表语句和数据存储语句!在这个 ...
- android okhttp和webview session共享
public static OkHttpClient get(Context context){ OkHttpClient.Builder builder = new OkHttpClient.Bui ...