PAT 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
考察插入排序与归并排序,需注意的是,此处考察的是归并排序的自底向上的方法而非递归形式的自顶向下。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
#include<math.h>
//交换元素
void swap(int &a,int &b){
int temp = a;
a = b;
b = temp;
}
//打印数组
void print(int a[],int n){
printf("%d",a[]);
for(int i=;i<n;i++){
printf(" %d",a[i]);
}
printf("\n");
} //归并排序中的合并操作
void merge(int a[],int start,int mid,int end){
int c[];
int start1 = mid+;
int k = ;
int h = start;
while(start<=mid&&start1<=end){
if(a[start]<a[start1])
c[k++] = a[start++];
else
c[k++] = a[start1++];
}
while(start<=mid)
c[k++] = a[start++];
while(start1<=end)
c[k++] = a[start1++];
for(int i=;i<k;i++)
a[i+h] = c[i]; }
//归并排序中自顶向下的递归形式
/*void mergeSort(int a[],int start,int end){
if(start<end){
int mid = (start+end)/2;
mergeSort(a,start,mid);
mergeSort(a,mid+1,end);
merge(a,start,mid,end);
print(a,10);
}
}*/ //归并排序中自底向下的形式
void mergeSort(int a[],int length,int n){
int i;
for(i=;i+*length-<n;i=i+length*)
merge(a,i,i+length-,i+*length-);
if(i+length-<n)
merge(a,i,i+length-,n);
} int main(){
int n;
int a[];
int a1[];
int b[];
int j;
int flag=,flag1=;
scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%d",&a[i]);
a1[i] = a[i];
}
for(int i=;i<n;i++){
scanf("%d",&b[i]);
}
//插入排序
for(int i=;i<n;i++){
for(j=i;j>;j--){
if(a[j]<a[j-]){
swap(a[j],a[j-]);
}
}
if(flag){
printf("Insertion Sort\n");
print(a,n);
return ;
}
for(j=;j<n;j++){
if(a[j]!=b[j]){
break;
}
}
if(j==n){
flag = ;
}
}
//归并排序
int length;
for(length=;length<n;length=length*){
mergeSort(a1,length,n-);
if(flag1){
printf("Merge Sort\n");
print(a1,n);
return ;
}
for(j=;j<n;j++){
if(a1[j]!=b[j])
break;
}
if(j==n)
flag1 = ;
} }
PAT 1035. 插入与归并(25)的更多相关文章
- PAT (Basic Level) Practise (中文)-1035. 插入与归并(25)
PAT (Basic Level) Practise (中文)-1035. 插入与归并(25) http://www.patest.cn/contests/pat-b-practise/1035 ...
- PAT-乙级-1035. 插入与归并(25)
1035. 插入与归并(25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 根据维基百科的定义: 插入排序是迭 ...
- PAT 1035 插入与归并(25)(代码+思路+测试点分析)
1035 插入与归并(25 分) 根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如此迭代直到 ...
- PAT 1035 插入与归并(25)
原题:https://pintia.cn/problem-sets/994805260223102976/problems/994805286714327040传送门: 根据维基百科的定义: 插入排序 ...
- PAT——1035. 插入与归并
根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如此迭代直到全部元素有序. 归并排序进行如下迭 ...
- PAT 1035 插入与归并
https://pintia.cn/problem-sets/994805260223102976/problems/994805286714327040 据维基百科的定义: 插入排序是迭代算法,逐一 ...
- 1035 插入与归并 (25 分)C语言
根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如此迭代直到全部元素有序. 归并排序进行如下迭 ...
- PAT(B) 1035 插入与归并(Java)
题目链接:1035 插入与归并 (25 point(s)) 参考博客:PAT乙级--1035(插入排序和归并)java实现熊仙森 题目描述 根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据, ...
- P 1035 插入与归并
转跳点 :
随机推荐
- android开发Preference的使用
1 .Preference是androidSDK提供的一个基类从API1就开始有了,用于显示界面给用户. 2 .在使用Preference显示activity时,此activity需要继承Pref ...
- 【HTML】 frame和iframe的区别
1.frame不能脱离frameSet单独使用,iframe可以: 2.frame不能放在body中:如下可以正常显示: <!--<body>--> <frameset ...
- HTML5标签
可以进行省略的标签 不允许写结束标记的标签:area(定义图像映射中的区域).base(为页面上的所有链接规定默认地址或默认目标).br.col(为表格中一个或多个列定义属性值).embed(定义嵌入 ...
- javascript的函数(二)
1. 函数的作用域 作用域是指变量的存在的范围.javascript中有两种作用域,一种是全局作用域,变量在整个程序中一直存在,另一种是函数作用域,变量只存在于函数体内部.在函数体外部声明的变量就是全 ...
- Android开发1:基本UI界面设计——布局和组件
前言 啦啦啦~本学期要开始学习Android开发啦~ 博主在开始学习前是完完全全的小白,只有在平时完成老师要求的实验的过程中一步一步学习~从此篇博文起,博主将开始发布Android开发有关的博文,希望 ...
- HTML5快速入门(三)—— 标签综合运用
前言: 1.HTML5的发展非常迅速,可以说已经是前端开发人员的标配,在电商类型的APP中更是运用广泛,这个系列的文章是本人自己整理,尽量将开发中不常用到的剔除,将经常使用的拿出来,使需要的朋友能够真 ...
- Fragment与ViewPager
众所周知,为了实现滑动界面,经常让Fragment与ViewPager一起结合使用,每一个ViewPager的页面就是一个Fragment,我们可以在fragment中实现丰富的功能.它的基本用法可以 ...
- iOS Swift-HelloWord
iOS Swift-HelloWord 按部就班选择Swif开发语言,输出HelloWord. override func viewDidLoad() { super.viewDidLoad() pr ...
- iOS开发之Bug--UITextField使用时文字向下偏移问题
这个问题,在之前项目中偶然遇到过,但是bug不明显,也不知道具体是哪种重现方式重现的,所以一直暂时略过了,但是随着项目的系统的规模变大,代码量越多, 这个问题出现的越来越明显了. 于是就只能靠百度和g ...
- 正则表达式的JS验证
/判断输入内容是否为空 function IsNull(){ var str = document.getElementById('str').value.trim(); ...