PAT甲题题解1098. Insertion or Heap Sort (25)-(插入排序和堆排序)
题目就是给两个序列,第一个是排序前的,第二个是排序中的,判断它是采用插入排序还是堆排序,并且输出下一次操作后的序列。
插入排序的特点就是,前面是从小到大排列的,后面就与原序列相同。
堆排序的特点就是,后面是从小到大排列的最大的几个数p~n-1,前面第一位则是p-1。
所以只要先按照插入排序的特点来判断是否为插入排序,接下来再进行操作就可以了,这里要手动写下最大堆的更新操作。
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
/* 之前一直WA的原因是,用for循环写寻找idx一开始就写错了。。。
找了整个序列的<,应该是找反例>从而跳出for循环,或者直接加到条件里。
比如:
一开始这么写,
for(int i=0;i<n;i++){
if(num2[i]<=num2[i+1])
idx++;
}
正确应该是:
for(idx=0;idx<n-1 && num2[idx]<=num2[idx+1];idx++);
晕死。。。脑子糊涂了
*/
using namespace std;
const int maxn=;
int heap[maxn];
int heap_size=; void swaps(int &a,int &b){
int tmp;
tmp=a;
a=b;
b=tmp;
}
void heap_update(int i){
int bigger=i;
int l=(i<<)+;
int r=(i<<)+;
if(l<heap_size && heap[l]>heap[i])
bigger=l;
if(r<heap_size && heap[r]>heap[bigger])
bigger=r;
if(bigger!=i){
swaps(heap[i],heap[bigger]);
heap_update(bigger);
}
}
void heap_pop(){
if(heap_size>=){
swaps(heap[],heap[heap_size-]); //take the max to the rear.
heap_size--;
heap_update();
}
} int main()
{
int n;
int num[maxn],num2[maxn]; scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%d",&num[i]);
}
for(int i=;i<n;i++){
scanf("%d",&num2[i]);
}
int idx;
for(idx=;idx<n- && num2[idx]<=num2[idx+];idx++);
int p=idx+;
for(;p<n && num[p]==num2[p];p++);
if(p==n){
sort(num2,num2+idx+); //相当于将num[idx+1]插入到前面排序
printf("Insertion Sort\n");
for(int i=;i<n-;i++)
printf("%d ",num2[i]);
printf("%d",num2[n-]);
}
else{
int sortedsize=;
int tmpnum[maxn];
for(int i=;i<n;i++)
tmpnum[i]=num[i];
sort(tmpnum,tmpnum+n);
p=n-;
/*
看了别人网上有写第三行AC的,
但按道理来说,如果样例2的第二个序列是6 4 5 0 1 2 3 7 8 9,那明显第三行就不对额。 10
3 1 2 8 7 5 9 4 6 0
6 4 5 0 1 2 3 7 8 9
Heap Sort
5 4 3 0 1 2 6 7 8 9 (第一行的输出)
5 4 0 6 1 2 3 7 8 9 (第三行的输出)
*/
for(;p>= && num2[p]==tmpnum[p];p--);
//for(;p>=1 && num2[p]>=num2[0];p--);
//for(;p>=1 && num2[p]>=num2[p-1];p--); //个人认为应该是过不了的。。。但却AC了 heap_size=p+;
for(int i=;i<n;i++)
heap[i]=num2[i];
heap_pop();
printf("Heap Sort\n");
for(int i=;i<n-;i++){
printf("%d ",heap[i]);
}
printf("%d",heap[n-]);
}
return ;
}
PAT甲题题解1098. Insertion or Heap Sort (25)-(插入排序和堆排序)的更多相关文章
- PAT (Advanced Level) Practise - 1098. Insertion or Heap Sort (25)
http://www.patest.cn/contests/pat-a-practise/1098 According to Wikipedia: Insertion sort iterates, c ...
- pat 甲级 1098. Insertion or Heap Sort (25)
1098. Insertion or Heap Sort (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yu ...
- PAT (Advanced Level) 1098. Insertion or Heap Sort (25)
简单题.判断一下是插排还是堆排. #include<cstdio> #include<cstring> #include<cmath> #include<ve ...
- 【PAT甲级】1098 Insertion or Heap Sort (25 分)
题意: 输入一个正整数N(<=100),接着输入两行N个数,表示原数组和经过一定次数排序后的数组.判断是经过插入排序还是堆排序并输出再次经过该排序后的数组(数据保证答案唯一). AAAAAcce ...
- PAT Advanced 1098 Insertion or Heap Sort (25) [heap sort(堆排序)]
题目 According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and ...
- 1098. Insertion or Heap Sort (25)
According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and gr ...
- 1098 Insertion or Heap Sort (25分)
According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and gr ...
- PAT甲题题解-1002. A+B for Polynomials (25)-多项式相加
注意两点:1.系数也有可能加起来为负!!!一开始我if里面判断为>0导致有样例没过...2.如果最后所有指数的系数都为0,输出一个0即可,原本以为是输出 1 0 0.0... #include ...
- PAT甲题题解-1039. Course List for Student (25)-建立映射+vector
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789157.html特别不喜欢那些随便转载别人的原创文章又不给 ...
随机推荐
- 利用MSF的MS08_067模块攻击windows server 2003 SP2中文版系统
一.测试环境 攻击机:kali(NMAP+MSF) 靶机:windows server 2003 SP2 中文版 利用漏洞:MS08_067 二.漏洞描述 MS08-067漏洞的全称为“Windows ...
- 网络唤醒(WOL)全解指南:原理篇
什么是网络唤醒 网络唤醒(Wake-on-LAN,WOL)是一种计算机局域网唤醒技术,使局域网内处于关机或休眠状态的计算机,将状态转换成引导(Boot Loader)或运行状态.无线唤醒(Wake-o ...
- 不要以为字段以transient修饰的话就一定不会被序列化
1: 先阅读这边文章:http://www.importnew.com/21517.html 2:被transient修饰真的会被序列化吗? 反例:java.util.ArrayList中底层存储数组 ...
- sublime出现 unable download.......
I managed to fix this by changing my package settings. I made my osx downloader preference curl, and ...
- java读写properties配置文件不改变属性的顺序和注释
先贴代码 import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java ...
- NSDictionary实现原理-ios哈希hash和isEqual
NSDictionary实现原理-ios哈希hash和isEqual OC中自定义类的NSCopying实现的注意事项(isEqual & hash实现) http://blog.csdn ...
- excel中散点图和折线图的区别(散点图时间均匀分布)
折线图可以显示随单位(如:单位时间)而变化的连续数据,因此非常适用于显示在相等时间间隔下数据的趋势.散点图显示若干数据系列中各数值之间的关系,或者将两组数绘制为 xy 坐标的一个系列.-------- ...
- 03-Maven坐标管理
1.什么是坐标? 2.坐标的详细概念 3.Maven包引用
- 解决eth0网卡无法自动加载的问题
问题:输入ifup eth0显示无法加载网卡所在的文件 解决办法: vi /etc/rc.d/rc.local 最后一行加入: ifup eth0 然后重启虚拟机即可解决问题. 本文为博主原创文章,未 ...
- Tomcat端口被占用解决方案
Tomcat端口被占用解决方法 1.在dos下,输入 netstat -ano|findstr 8080 //说明:查看占用8080端口的进程,显示占用端口的进程 2.taskkill /pid 19 ...