pta 插入排序还是堆排序
根据维基百科的定义:
插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。
堆排序也是将输入分为有序和无序两部分,迭代地从无序部分找出最大元素放入有序部分。它利用了大根堆的堆顶元素最大这一特征,使得在当前无序区中选取最大元素变得简单。
现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法?
输入格式:
输入在第一行给出正整数 N (≤100);随后一行给出原始序列的 N 个整数;最后一行给出由某排序算法产生的中间序列。这里假设排序的目标序列是升序。数字间以空格分隔。
输出格式:
首先在第 1 行中输出Insertion Sort表示插入排序、或Heap Sort表示堆排序;然后在第 2 行中输出用该排序算法再迭代一轮的结果序列。题目保证每组测试的结果是唯一的。数字间以空格分隔,且行首尾不得有多余空格。
输入样例 1:
10
3 1 2 8 7 5 9 4 6 0
1 2 3 7 8 5 9 4 6 0
输出样例 1:
Insertion Sort
1 2 3 5 7 8 9 4 6 0
输入样例 2:
10
3 1 2 8 7 5 9 4 6 0
6 4 5 1 0 3 2 7 8 9
输出样例 2:
Heap Sort
5 4 3 1 0 2 6 7 8 9
错误记录:开始是插入还是堆排判断错误。后来竟然是插入排序出错了
初始判断排序种类,错误代码
if((am[1]<am[2])&&am[1]!=num[1]&&am[n]==num[n])
插入排序错误
int i,j;for(i=1;i<n&&am[i]<am[i+1];i++){;}int key=am[i+1];for(j=i;j>=1;j--){if(am[j]>key) am[j+1]=am[j];else break;}am[j+1]=key;
正确的插入排序是从第二个元素开始。依次比较和他前面元素的大小。
---------------------------------
正确代码
#include<stdio.h>
void insert_sort(int *am,int n)
{int i,j;for(i=2; i<=n&&am[i-1]<=am[i]; i++);int key=am[i];for(j=i-1;j>=1;j--){if(am[j]>key) am[j+1]=am[j];else break;}am[j+1]=key;
}
void swap(int *a,int *b)
{int t=*a;*a=*b;*b=t;
}
void maxheapify(int *am,int i,int n)
{int l,r,max;while(1){l=i<<1;r=i<<1|1;if(l<=n&&am[l]>am[i]) max=l;else max=i;if(r<=n&&am[r]>am[max]) max=r;if(max==i) return;swap(&am[i],&am[max]);i=max;}
}
void heap_sort(int *am,int n)
{int i,size;for(i=n;i>1&&am[i]>am[i-1];i--){;}size=i-1;swap(&am[1],&am[i]);maxheapify(am,1,size);
}
int main(void)
{int n;scanf("%d",&n);int num[120]={0};int am[120]={0};for(int i=1;i<=n;i++)scanf("%d",num+i);for(int i=1;i<=n;i++)scanf("%d",am+i);if(am[1]<am[2]){printf("Insertion Sort\n");insert_sort(am,n);for(int i=1;i<=n;i++){if(i!=n) printf("%d ",am[i]);else printf("%d\n",am[i]);}}else{printf("Heap Sort\n");heap_sort(am,n);for(int i=1;i<=n;i++){if(i!=n) printf("%d ",am[i]);else printf("%d\n",am[i]);}}return 0;}
pta 插入排序还是堆排序相关推荐
- ❤️万字总结八大排序:冒泡排序,选择排序,插入排序,堆排序,希尔排序,归并排序,计数排序❤️
目录 主要排序算法性能对比 冒泡排序 选择排序 插入排序 堆排序 希尔排序 快速排序 Hoare版 挖坑版 前后指针法 归并排序 计数排序 海量数据的排序问题 主要排序算法性能对比 冒泡排序 各位同学 ...
- PTA 函数题 堆排序(C语言)
本题要求实现堆排序中的筛选函数,待排序列的长度1<=n<=1000. 函数接口定义: void HeapAdjust( HeapType H, int s, int m); 其中L是待排序 ...
- PAT甲级1098 Insertion or Heap Sort:[C++题解]堆排序和插入排序
文章目录 题目分析 题目链接 题目分析 分析 插入排序的特点:前半部分有序,后半部分保持原序. 堆排序的特点: 后半部分有序,前半部分无序. 本题的bug在于,答案是唯一的,即不是插入排序就是堆排序, ...
- 四种常见排序算法的对比和总结 插入排序、归并排序、快速排序、堆排序
目录 一.排序算法的时间复杂度 二.排序算法是否是原地排序 三.排序算法的额外空间 四.排序算法的稳定性 Stable 五.总结 这里我们要总结的排序算法主要有4个,分别是插入排序Insertion ...
- laravel 先排序后分组怎么写_插入排序的故事
话说计算机世界有一个诚实国,那里的人们不但诚实,而且尊老,每次排队都让年纪大的人排前面. 有一次小胖到诚实国去旅游,肚子饿了想吃东西,发现一个烧饼店门前有人排着队,他就跟在队伍后面一起排队.没过多久, ...
- 选择排序 插入排序 交换排序
动图演示: https://www.runoob.com/w3cnote/bubble-sort.html 选择排序 简单选择排序 在未排序的序列中,选出最小的元素和序列的首位元素交换,接下来在剩下的 ...
- 数据结构——平衡二叉树PTA习题(很多不会的,求大佬帮忙写题解)
文章目录 单选题 选择题题解 编程题 7-3 插入排序还是堆排序 (25分) 不会 输入格式: 输出格式: 输入样例 1: 输出样例 1: 输入样例 2: 输出样例 2: 代码 7-4 愿天下有情人都 ...
- 高效排序算法——希尔排序、堆排序、归并排序、快速排序
如标题,这里讨论的是基于比较的排序算法中最高效的三种算法和希尔排序.堆排序.归并排序.快速排序的平均时间复杂度均为O(NlogN).前面有介绍过O(N2)的三种简单排序算法(见三大简单排序算法--插入 ...
- 【二级java】排序技术
例题1 :希尔排序属于下列哪种排序法 解析: 希尔排序法的基本思想是: 将整个无序序列分割成若干小的子序列分别进行插入排序,所以属于插入排序 例题2 : 在下列几种排序方法中,要求内存量最大的是 解析 ...
最新文章
- Linux系统无线鼠标不能用,手把手教你win7系统无线鼠标不能用的处理方案
- Hibernate学习4—关联关系一对多映射2
- Android 学习笔记 BroadcastReceiver广播...
- SQL99标准中的查询(MySQL)
- 1995 年乔布斯访谈:什么对产品最重要
- Go语言在Linux环境下输出彩色字符
- 均值差异大但是t检验不显著_T检验原理及介绍
- 张首晟教授:区块链让社会变得更加公平 与人工智能的结合令人激动 | IT领袖峰会...
- [HAOI2010]计数 数位DP+组合数
- SecureCRT恢复默认字体
- 联想 计算机无线网络设置方法,联想笔记本无线网络开关,详细教您联想笔记本无线网络开关...
- 如何在Mac上裁剪图片
- 机器学习多步时间序列预测解决方案
- Spline算法实现
- iOS15使用带Header的tableview 顶部出现空白问题
- mysql where or短路吗,是否对SQL WHERE子句进行了短路评估?
- 【小程序】websocket实现“谁是卧底”在线随机发牌
- Unity游戏开发官方入门教程:飞机大战(六)——创建子弹
- web项目-中日韩文通用UTF-8处理流程
- 第三天:基础入门-抓包封包协议APP小程序PC应用WEB应用
热门文章
- myeclipse生成注册码,破解,不用下载任何文件,代码方式破解
- 代码重构中的几个概念
- shell 读取配置文件
- (转)命令行下,用 xcodebuild 生成ipa文件,通过 itms-services 协议安装
- Oracle 添加RAC数据库集群节点(一)
- python logger
- 解释一下c语言 for(;;) printf(*);,printf()函数的一个问题
- android悬浮动态权限,android应用内悬浮窗-自动贴边,不需要权限!
- python post与get的区别_python中get和post有什么区别
- python计算选手最后得分并取出前三名_在Python中存储最后3个分数并删除旧分数并计算平均值?...