PAT甲级1098 Insertion or Heap Sort:[C++题解]堆排序和插入排序
文章目录
- 题目分析
- 题目链接
题目分析
分析
插入排序的特点:前半部分有序,后半部分保持原序。
堆排序的特点: 后半部分有序,前半部分无序。
本题的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++题解]堆排序和插入排序相关推荐
- 1098 Insertion or Heap Sort 需再做
1. 应该还做过一道类似的题目,也是要求判断属于哪种排序的中间过程,并要求写出下一轮排序结果,这次的进步是上来就知道用向量存数据,这样方便直接比较,而且下标0不能存元素,因为堆排序的堆是一个完全二叉树 ...
- 1098 Insertion or Heap Sort (25 分)【难度: 中 / 插入排序 堆排序 堆排序不会未完成】
https://pintia.cn/problem-sets/994805342720868352/problems/994805368847187968 堆排好久没写了不会写,有时间补
- PAT A1098 Insertion or Heap Sort
1098 Insertion or Heap Sort 分数 25 作者 CHEN, Yue 单位 浙江大学 According to Wikipedia: Insertion sort iterat ...
- 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 ...
- PAT甲级1089 Insert or Merge:[C++题解]插入排序、归并排序
文章目录 题目分析 题目来源 题目分析 来源:acwing 分析: ac代码 由于本题答案唯一,所以如果是插入排序,就不是归并排序.而且判断插入排序比较简单,所以本题直接判断是否是插入排序即可!! 如 ...
- PAT甲级1113 Integer Set Partition:[C++题解]贪心
文章目录 题目分析 题目来源 题目分析 来源:acwing 分析: 集合元素个数之差为0或1.两个集合元素之和,分别取最大的n1个数,和剩下的所有的数. ac代码 #include<bits/s ...
- PAT甲级1147 Heaps (30 分):[C++题解]堆、树的遍历、dfs、完全二叉树建树
文章目录 题目分析 题目来源 题目分析 来源:acwing 分析:给定完全二叉树,判断是否是堆,需要区分大根堆,小根堆.后面是输出后序遍历. AC代码 #include<bits/stdc++. ...
- PAT甲级1062 Talent and Virtue:[C++题解]结构体、哈希表
文章目录 题目分析 题目来源 题目分析 来源:acwing 分析: 分4个vector,单独排序即可. ac代码 #include<bits/stdc++.h> using namespa ...
- PAT甲级1052 Linked List Sorting:[C++题解]链表排序
文章目录 题目分析 题目链接 题目分析 题意:给定数据(里面有不构成链表的数据,若是,则跳过),是链表的构成链表.然后根据数值大小重新排序,构成新的链表. 分析:用数组模拟链表,先建立链表.遍历链表, ...
最新文章
- 《职场》笔记20061119
- 一本关于 女仆小说的构思,有能力写的看下
- [软件更新]Adobe Photoshop Elements 8.0.0
- SM30里如何输入物料号自动带出物料描述
- python基础教程:排列与组合
- 部署WAR包实时查看Tomcat的状态和日志
- marting mate 是真的香喷喷的 学术英语必备
- java中实现同步的两种方式:syschronized和lock的区别和联系
- HDU 4336 概率DP 状压
- java程序设计图形题_面向对象与Java程序设计基础题目:设计一个程序可以一计算平面图形的面积和立体图形的体积。1.使用interface关键...
- H5商城在微信APP里支付
- Java实现QQ、微信等自动无限发送消息(炸屏)
- cad卸载_老师傅爱不释手的6款CAD插件,款款优秀,用了就再也不舍得卸载
- 高等数学张宇18讲 第三讲 一元函数微分学的概念与计算
- 并网光伏发电系统(simulink仿真)
- MacBook常用快捷键
- 【算法导论】幻方算法
- zigzag算法详解
- HTML静态网页作业——(国乒网 8页) HTML+CSS+JavaScript
- 广数25i系统倒刀回刀m代码_GSK-25i数控铣床加工中心系统介绍