数据结构和算法 堆排序 (图解堆调整)
什么是堆?
堆:是一种特殊的序列 并且 将该序列想象为 完全二叉树
元素满足:
- (ki <= k2i && ki <= k2i+1) 每个结点一定比它的左右孩子小 这种堆称为 最小化堆(小堆) (树根是最小的)
- (ki >= k2i && ki >= k2i+1) 每个点一定比它的左右孩子大 这种堆称为 最大化堆(大堆) (树根是最大的)
堆排序(以最大化堆为例)
堆调整(堆的初始化):排序之前需要将序列调整为 堆 (不满足时 与 左右孩子中较大的那一个进行交换) 从n/2向下取整个点开始由后向前调整直到满足堆条件为止。
排序:
- 从堆顶取出最大元素 ,堆顶元素与堆的最后一个元素交换位置 (往后就不用考虑当前最后一个元素)。
- 对剩余的元素进行调整 , 调整选择剩下元素中的最大元素 (根与左右孩子中较大的那个进行交换直到满足条件为止)即 对根进行堆调整。
- 重复以上过程 直到序列有序为止 (大堆升序)。
例子 (堆调整过程)
初始序列为:5 4 8 0 9 3 2 6 7 1
1.画出该序列完全二叉树
2.找到n/2向下取整的点 本例为 (9)从后往前逐个调整
0 < 6 同时 0 < 7 因为 7 > 6 故 0 与 7 交换 ;满足条件 。
8满足条件 继续 4 < 7 同时 4 < 9 因为 9 > 7 故 4 与 9 交换 ;满足条件。
5 < 9 同时 5 < 8 因为 9 > 8 故 5 与 9 交换 ;此时 5 < 7 不满足 5与7 交换 ;此时 5 <
6 不满足 5与6 交换;满足条件。堆排序
参考上述排序过程。
代码
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>typedef long long ll;
using namespace std;const int N = 1010;
int n;
int a[N];
void mheap(int a[],int x,int m)
{int temp;while((2*x <= m && a[x] < a[2*x]) || (2*x+1 <= m && a[x] < a[2*x+1])) // 小于左右孩子 并且 防止越界{temp = a[2*x] >= a[2*x+1]||2*x == m ? 2*x:2*x+1; // 比较左右孩子取较大的那个,也可能存在只有左孩子swap(a[x],a[temp]);x = temp;}
}void heapsort(int a[],int len)
{for(int i = len/2;i >= 1;i--)mheap(a,i,len); //对n/2向下取整由后往前调整for(int j = len;j >= 2;j--){swap(a[1],a[j]);mheap(a,1,j - 1); //对根节点调整}
}
int main()
{ios::sync_with_stdio(0),cin.tie(0);cin >> n;for(int i = 1;i <= n;i++) cin >> a[i];heapsort(a,n);for(int i = 1;i <= n;i++)cout << a[i] <<' ';return 0;
}
数据结构和算法 堆排序 (图解堆调整)相关推荐
- 数据结构与算法 | 堆排序
堆排序 在上一章节里我们完成了堆的实现和基本操作:https://blog.csdn.net/qq_35423154/article/details/104598702 这里就顺带讲一讲堆排序 堆排序 ...
- 数据结构与算法——二叉树、堆、优先队列
*************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 七 ...
- 数据结构与算法--二叉堆(最大堆,最小堆)实现及原理
二叉堆(最大堆,最小堆)实现及原理 二叉堆与二叉查找树一样,堆也有两个性质,即结构性质和堆性质.和AVL树一样,对堆的一次操作必须到堆的所有性质都被满足才能终止,也就是我们每次对堆的操作都必须对堆中的 ...
- 数据结构排序算法实验报告_数据结构与算法-堆排序
堆排序 堆排序是指利用堆这种数据结构所设计的一种排序算法.堆是一个近似完全二叉树的结构,并同时满足堆的性质:即子节点的键值或索引总是小于(或者大于)它的父节点,堆排序的时间复杂度为O(nlogn).( ...
- 【数据结构与算法】配对堆的Java实现
PairingHeap的编程实现 /*** Implements a pairing heap.* Supports a decreaseKey operation.* Note that all & ...
- 【数据结构与算法】大根堆和优先队列的Java实现
异常类 public class TreeException extends RuntimeException {private static final long serialVersionUID ...
- Java数据结构与算法(26) - ch12堆(堆实现)
{TODO} 转载于:https://www.cnblogs.com/thlzhf/p/4089035.html
- 【算法】常见数据结构基本算法整理
去年11月份听了牛客网的课,当时做了纸质的笔记整理. 现在为了以后方便查找,将问题目录整理如下. 每道题只提供解题思路,不贴源代码. 可能会稍微手写一下代码(没有在IDE上测,为了试下以后面试时手写代 ...
- 数据结构与算法--面试必问AVL树原理及实现
数据结构与算法–AVL树原理及实现 AVL(Adelson-Velskii 和landis)树是带有平衡条件的二叉查找树,这个平衡条件必须容易实现,并且保证树的深度必须是O(logN).因此我们让一棵 ...
最新文章
- 关于同步加载与异步加载的区别
- 尚学python课程---11、linux环境下安装python注意
- python2.7怎么升级python3_如何将Mac OS X10.9下的Python2.7升级到最新的Python3.3
- 拼多多关联公司申请“碰多多”、“碰碰多”商标
- linux启动 mongo 不了问题
- PHP 空数组转Json字符串的问题
- RedHat Linux RHEL6配置本地YUM源
- spring中这些开发技巧真的太diao了
- 安全合规/ISO--1--ISO 27000系列标准介绍
- 【U8+】用友U816.1版本和天高联用,不显示“实施导航”功能模块
- iQOO Neo6 SE什么时候发布 iQOO Neo6 SE配置如何
- 利用原生node.js连接sql数据库
- c语言erfc函数,erf、erff、erfl、erfc、erfcf、erfcl
- 基于特征点检测的人脸融合技术
- redis缓存服务器
- python进行邮件文件.eml.pst.msg信息提取(包括附件)
- 101个CV模型集体开源,魔搭社区视觉AI深度解析
- K8S 创建 Deployment
- 设置MAC地址和动态IP
- EF提示一例对一个或多个实体的验证失败。有关详细信息,请参阅“EntityValidationErrors”属性的解决