文章目录

  • 题目分析
  • 题目链接

题目分析


分析
插入排序的特点:前半部分有序,后半部分保持原序。

堆排序的特点: 后半部分有序,前半部分无序。

本题的bug在于,答案是唯一的,即不是插入排序就是堆排序,所以仅仅判断是不是插入排序即可!

本题转化为如何判断一个序列是插入排序的某个过程呢?

需要从插入排序的特点出发:其特点为前半部分有序,后面的是原序。用一个指针往后扫描,直到不是有序的,看后面的是否和原序列一致即可

然后怎样输出下一次插入排序的序列呢? 用未排好序的第一个元素,从后往前逐个往前比较,小的就交换。 比如 [2 4 7][ 3 1 6]找到第一个未排好序的3,发现3比7小,两者交换,变成 [2 4 3][ 7 1 6]。然后比较3和它前面的 发现3比4小,两者交换 [2 3 4][ 7 1 6],这就是插入排序下一次排序的序列。

堆排序的下一轮排序的序列呢?
先要找到本轮堆排序后面排好序的部分,然后在前面的堆中选择最大的,放到排好序的部分。

然后前半部分这个堆的堆顶是第一个位置。 这就涉及到堆排序的原理,需要递归使用down函数,把最大值放到堆顶。
堆排序的核心函数

//每次判断当前这个点是不是比左右儿子都小
void down(int u, int size ){ //u表示堆顶的坐标,size表示当前堆的大小int t = u;if(u*2 <= size && b[t]< b[u*2]) t =2*u;if(u*2+1 <=size && b[t]<b[u*2+1])   t =u*2+1;if(t !=u) { //此结点不是最大的,交换,并且递归swap(b[t],b[u]);down(t,size);}}

ac代码

#include<bits/stdc++.h>
using namespace std;const int N=110;int n ,a[N],b[N];//每次判断当前这个点是不是比左右儿子都小
void down(int u, int size ){int t = u;if(u*2 <= size && b[t]< b[u*2]) t =2*u;if(u*2+1 <=size && b[t]<b[u*2+1])   t =u*2+1;if(t !=u) { //此结点不是最大的,交换,并且递归swap(b[t],b[u]);down(t,size);}}int main(){cin>>n;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++) cin>>b[i];int p=2;while(p<=n && b[p-1]<=b[p]) p++;int k =p,flag=0; //0表示插入排序;1表示堆排序for(int i=p;i<=n;i++){if(a[i]!=b[i]){flag=1;break;} } if(!flag){//插入排序cout<<"Insertion Sort"<<endl;for(int i=k;i>1;i--)if(b[i-1]>b[i]) swap(b[i],b[i-1]);} else{cout<<"Heap Sort"<<endl;int k1 =n;while(b[k1]>b[1]) k1--;swap(b[1],b[k1]);down(1,k1-1);}cout<<b[1];for(int i=2;i<=n;i++) cout<<" "<<b[i];}

题目链接

PAT甲级1098 Insertion or Heap Sort

PAT甲级1098 Insertion or Heap Sort:[C++题解]堆排序和插入排序相关推荐

  1. 1098 Insertion or Heap Sort 需再做

    1. 应该还做过一道类似的题目,也是要求判断属于哪种排序的中间过程,并要求写出下一轮排序结果,这次的进步是上来就知道用向量存数据,这样方便直接比较,而且下标0不能存元素,因为堆排序的堆是一个完全二叉树 ...

  2. 1098 Insertion or Heap Sort (25 分)【难度: 中 / 插入排序 堆排序 堆排序不会未完成】

    https://pintia.cn/problem-sets/994805342720868352/problems/994805368847187968 堆排好久没写了不会写,有时间补

  3. PAT A1098 Insertion or Heap Sort

    1098 Insertion or Heap Sort 分数 25 作者 CHEN, Yue 单位 浙江大学 According to Wikipedia: Insertion sort iterat ...

  4. PTA 09-排序3 Insertion or Heap Sort (25分)

    题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/676 5-14 Insertion or Heap Sort   (25分) Accor ...

  5. PAT甲级1089 Insert or Merge:[C++题解]插入排序、归并排序

    文章目录 题目分析 题目来源 题目分析 来源:acwing 分析: ac代码 由于本题答案唯一,所以如果是插入排序,就不是归并排序.而且判断插入排序比较简单,所以本题直接判断是否是插入排序即可!! 如 ...

  6. PAT甲级1113 Integer Set Partition:[C++题解]贪心

    文章目录 题目分析 题目来源 题目分析 来源:acwing 分析: 集合元素个数之差为0或1.两个集合元素之和,分别取最大的n1个数,和剩下的所有的数. ac代码 #include<bits/s ...

  7. PAT甲级1147 Heaps (30 分):[C++题解]堆、树的遍历、dfs、完全二叉树建树

    文章目录 题目分析 题目来源 题目分析 来源:acwing 分析:给定完全二叉树,判断是否是堆,需要区分大根堆,小根堆.后面是输出后序遍历. AC代码 #include<bits/stdc++. ...

  8. PAT甲级1062 Talent and Virtue:[C++题解]结构体、哈希表

    文章目录 题目分析 题目来源 题目分析 来源:acwing 分析: 分4个vector,单独排序即可. ac代码 #include<bits/stdc++.h> using namespa ...

  9. PAT甲级1052 Linked List Sorting:[C++题解]链表排序

    文章目录 题目分析 题目链接 题目分析 题意:给定数据(里面有不构成链表的数据,若是,则跳过),是链表的构成链表.然后根据数值大小重新排序,构成新的链表. 分析:用数组模拟链表,先建立链表.遍历链表, ...

最新文章

  1. 《职场》笔记20061119
  2. 一本关于 女仆小说的构思,有能力写的看下
  3. [软件更新]Adobe Photoshop Elements 8.0.0
  4. SM30里如何输入物料号自动带出物料描述
  5. python基础教程:排列与组合
  6. 部署WAR包实时查看Tomcat的状态和日志
  7. marting mate 是真的香喷喷的 学术英语必备
  8. java中实现同步的两种方式:syschronized和lock的区别和联系
  9. HDU 4336 概率DP 状压
  10. java程序设计图形题_面向对象与Java程序设计基础题目:设计一个程序可以一计算平面图形的面积和立体图形的体积。1.使用interface关键...
  11. H5商城在微信APP里支付
  12. Java实现QQ、微信等自动无限发送消息(炸屏)
  13. cad卸载_老师傅爱不释手的6款CAD插件,款款优秀,用了就再也不舍得卸载
  14. 高等数学张宇18讲 第三讲 一元函数微分学的概念与计算
  15. 并网光伏发电系统(simulink仿真)
  16. MacBook常用快捷键
  17. 【算法导论】幻方算法
  18. zigzag算法详解
  19. HTML静态网页作业——(国乒网 8页) HTML+CSS+JavaScript
  20. 广数25i系统倒刀回刀m代码_GSK-25i数控铣床加工中心系统介绍

热门文章

  1. 2017寒假练习题解 第四周 2.6-2.12
  2. c语言实现字符指针(字符串)数组的排序
  3. 网络编程Socket之UDP
  4. python requests
  5. 检测线程是否存活代码!
  6. 分类9个无理数并比较他们之间的分布差异
  7. 【STM32】FreeRTOS 调度器开启和任务相关函数详解
  8. LaTeX设置单双栏方法 基于LaTex+VSCode+MAC
  9. 【问题】14500充电锂电池电量问题及测试方案
  10. nginx DNS 缓存问题