题目就是给两个序列,第一个是排序前的,第二个是排序中的,判断它是采用插入排序还是堆排序,并且输出下一次操作后的序列。

  插入排序的特点就是,前面是从小到大排列的,后面就与原序列相同。

  堆排序的特点就是,后面是从小到大排列的最大的几个数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)-(插入排序和堆排序)的更多相关文章

  1. 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 ...

  2. pat 甲级 1098. Insertion or Heap Sort (25)

    1098. Insertion or Heap Sort (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yu ...

  3. PAT (Advanced Level) 1098. Insertion or Heap Sort (25)

    简单题.判断一下是插排还是堆排. #include<cstdio> #include<cstring> #include<cmath> #include<ve ...

  4. 【PAT甲级】1098 Insertion or Heap Sort (25 分)

    题意: 输入一个正整数N(<=100),接着输入两行N个数,表示原数组和经过一定次数排序后的数组.判断是经过插入排序还是堆排序并输出再次经过该排序后的数组(数据保证答案唯一). AAAAAcce ...

  5. PAT Advanced 1098 Insertion or Heap Sort (25) [heap sort(堆排序)]

    题目 According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and ...

  6. 1098. Insertion or Heap Sort (25)

    According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and gr ...

  7. 1098 Insertion or Heap Sort (25分)

    According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and gr ...

  8. PAT甲题题解-1002. A+B for Polynomials (25)-多项式相加

    注意两点:1.系数也有可能加起来为负!!!一开始我if里面判断为>0导致有样例没过...2.如果最后所有指数的系数都为0,输出一个0即可,原本以为是输出 1 0 0.0... #include ...

  9. PAT甲题题解-1039. Course List for Student (25)-建立映射+vector

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789157.html特别不喜欢那些随便转载别人的原创文章又不给 ...

随机推荐

  1. SNMP协议利用

    1.安装snmp服务 2.配置snmp服务 运行Services.msc 添加社区public,只读 启动服务 3.在kali运行 Snmpwalk -c public -v 2c IP 即可查看目标 ...

  2. 【Lucene4.8教程之六】QueryParser与Query子类:怎样生成Query对象

    版权声明:本文为博主原创文章.转载请注明来自http://blog.csdn.net/jediael_lu/ https://blog.csdn.net/jediael_lu/article/deta ...

  3. BZOJ1458:士兵占领(有上下界最小流)

    Description 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵,一个格子里最多可以放置一个士兵,障碍格里不能放置士兵.我们称这些士兵占领了整个棋盘当满足第i行至少放 ...

  4. Linux平台安装Oracle11gR2数据库

    1. 数据库安装先决条件 1.1 认证的操作系统检查确认 o RHEL4,OEL4 - update 7 or greater o RHEL5,OEL5 - 5.2 or greater o RHEL ...

  5. php 两个二维数组重组新数组,数组下标不同

    Array ( [0] => Array ( [PosNum] => 27025008 [start_time] => 20180328164929 [type] => 0 ) ...

  6. Python正则表达式操作指南(转)

    原文出处:http://www.amk.ca/python/howto/regex/ 适用版本:Python 1.5 及后续版本 摘要 本文是通过Python的 re 模块来使用正则表达式的一个入门教 ...

  7. JS添加标签效果

    JS添加标签效果 在豆瓣网上添加自己的标签是一种常见的效果,今天也就做了一个简单的demo.由于时间的问题 我不多原理,大家可以试着操作几遍就能明白其中的原理了. JSFiddle的效果如下: 点击我 ...

  8. C# 取两个集合的交集\并集\差集

    交集:Intersect 并集:Union 差集:Except , , , , , }; , , , ,,, }; var C= A.Intersect(B); //交集 { 3, 4, 5, 6 } ...

  9. VB6 CHECK is run as admin privilege

    vb6 code: Private Declare Function IsUserAnAdmin Lib "Shell32" Alias "#680" () A ...

  10. 20155209林虹宇 Exp7 网络欺诈防范

    Exp7 网络欺诈防范 简单应用SET工具建立冒名网站 kali要作为web服务器让靶机访问冒名网站,所以要使用阿帕奇web服务器软件. 要阿帕奇使用80端口.进入配置文件/etc/apache2/p ...