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

2. 所以基础知识没啥好说,得会插排和堆排,插排有一个地方很容易错,就是判断插入位置的while条件,应该是temp和vi[j-1]而不是和vi[j]比较,如果是temp小就继续向前。

3. 另外是堆排序在每一轮排序中判断和对照向量是否相等的时机,我们知道,堆排序每一轮是先让当前未排序的最后一个元素和第一个元素交换,然后对第一个元素进行向下调整,对照时机是在这两步都完成后,而不是在这两者之间。

4. 有过纠结:这个排序到底让我用最大堆还是最小堆,现在看来由于是增序排列,所以是最大堆

又重新做了一遍,新增两个注意点:

5. 既然downAdjust函数都写出了,建堆就用从最后一个叶子结点开始,一直往上数到头节点,向下调整。不要用那个从第一个节点开始,看最上能上到哪的简易建堆方式。

6. 封装每个函数,都要关注返回值有没有。

AC代码

#include<cstdio>
#include<map>
#include<set>
#include<string>
#include<cstring>
#include<iostream>
#include<vector>
#include<stack>
#include<queue>
#include<algorithm>
#include<cmath>
typedef long long LL;using namespace std;const int maxn = 110;vector<int> init,comp;//初始序列,对照序列
vector<int> procByIn;//插排处理序列
vector<int> procByHe;//堆排序处理序列
int n;//元素个数
int heapRes = false;void downAdjust(int low,int high){int i = low;int j = i*2;while(j<=high){if(j+1<=high&&procByHe[j+1]>procByHe[j])j=j+1;if(procByHe[j]>procByHe[i]){swap(procByHe[i],procByHe[j]);i = j;j = i*2;}else break;}
}void createHeap(){for(int i=n/2;i>=1;i--){downAdjust(i,n);}
}void heapSort(){createHeap();for(int i=n;i>=1;i--){swap(procByHe[1],procByHe[i]);downAdjust(1,i-1);   if(procByHe==comp){printf("Heap Sort\n");   heapRes = true;//提前进入下一轮 swap(procByHe[1],procByHe[i-1]);downAdjust(1,i-2);for(int j=1;j<=n;j++){printf("%d",procByHe[j]);if(j!=n)printf(" ");}printf("\n");break;}}
}void insertSort(){bool canPrint = false;for(int i=2;i<=n;i++){int j = i;int temp = procByIn[i];while(j>1&&temp<procByIn[j-1]){procByIn[j] = procByIn[j-1];j--;}procByIn[j] = temp;if(canPrint){for(int k=1;k<=n;k++){printf("%d",procByIn[k]);if(k!=n)printf(" ");}printf("\n");break;}if(procByIn==comp){printf("Insertion Sort\n");canPrint = true;}}
} int main(){scanf("%d",&n);int num;init.push_back(0);//占位 for(int i=0;i<n;i++){scanf("%d",&num);init.push_back(num);}comp.push_back(0);for(int i=0;i<n;i++){scanf("%d",&num);comp.push_back(num); } procByHe = init;heapSort(); if(!heapRes){//不是堆排序,再进行插入排序 procByIn = init;insertSort();}return 0;
}

1098 Insertion or Heap Sort 需再做相关推荐

  1. PAT甲级1098 Insertion or Heap Sort:[C++题解]堆排序和插入排序

    文章目录 题目分析 题目链接 题目分析 分析 插入排序的特点:前半部分有序,后半部分保持原序. 堆排序的特点: 后半部分有序,前半部分无序. 本题的bug在于,答案是唯一的,即不是插入排序就是堆排序, ...

  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. 1081 Rational Sum 有理数类型题处理 需再做

    一.有理数结构体的几个约束 struct fraction{LL up,down;fraction(LL _up,LL _down):up(_up),down(_down){} }; (1)如果这个有 ...

  6. 1102 Invert a Binary Tree 需再做

    1. 题目的输入是,先给出结点总数N,然后N行给出的是值为x(0<=x<=N-1)的结点的左右结点的值,若不存在左/右结点,则值为 - . 2. 这一题我用动态链表没有做出来,根据参考书提 ...

  7. 1103 Integer Factorization 需再做

    本题是典型的DFS+剪枝 我对DFS有了更深的认识:整个过程就是一片森林(根节点不唯一)的生长,到了界限就得到结果并返回或者得不到结果也返回,DFS的参数存放的是所有需要积累的变量. 提示: 1. 最 ...

  8. 1136 A Delayed Palindrome 需再做

    注意点: 1. 大整数即高精度整数,数据结构bign要会定义 2. 记得写构造函数或者通过别的方式初始化bign 3. len属性记得手动更新 4. int d[maxn]数组是顺位存储,意味着字符串 ...

  9. 1040 Longest Symmetric String 需再做

    解题思路 本题属于最长回文子串专题下.与之前的LIS和LCS的动规有两个较大的不同 1. 虽然最后也是要求长度,但是长度信息不再蕴含在dp数组当中,dp[i][j]表示的仅仅是从s[i]起s[j]止这 ...

最新文章

  1. 利用.bat(批处理)来删除KEIL编译生成的无用文件
  2. 仿射变换 c语言,c语言数字图像处理(三):仿射变换
  3. 学Python从业前景如何?工作机会多吗?
  4. 使用Asynchronous RFC call 拆分time consuming task
  5. 写给新手的WebAPI实践
  6. 迪士尼正式收购21世纪福克斯!网友:原来米老鼠才是灭霸…
  7. 剑指offer三从头到尾打印链表
  8. python自动化是什么意思_浅谈 Python 自动化
  9. LabVIEW前面板数值控件显示7段LED数码管样式
  10. linux 3.16内核下载,linux块设备驱动程序示例(适用于高版本内核3.16.0 - 3.19.0等,亲测可用)...
  11. 企业微信小程序(企业内部)怎么自定义工作台和通过中文名模糊查询到员工的个人信息和userid
  12. SQLite崩溃处理
  13. 详谈利用系统漏洞及mysql提权
  14. Wince6.0nbsp;s3c6410触摸屏驱动分析
  15. 8、ARM嵌入式系统:UART初始化
  16. Neural Collaborative Filtering 1
  17. Java图片转换为PDF并合成同一PDF
  18. 电子邮件里的CC和BCC的全称是什么?
  19. 大学文科生vs大学理科生
  20. 《深度学习与图像识别原理与实践》—读书笔记

热门文章

  1. js把for循环出来的数据存入数组
  2. vmware的三种网络模式讲解
  3. 从 Flutter 的视频渲染到 App 落地经验
  4. Python-100 练习题 01 列表推导式
  5. consul安装配置使用
  6. CC2540 OSAL 学习其中原理,以及 给任务 添加 一个事件(定时发送串口消息)
  7. 理解NSAttributedString
  8. Google推荐的15条HTML 5代码军规----来看看你知道几个,我一个都不知道。。。
  9. 关注基于云的下一代应用开发
  10. 自己架设windows升级服务器