什么是堆?

:是一种特殊的序列 并且 将该序列想象为 完全二叉树

元素满足

  • (ki <= k2i && ki <= k2i+1) 每个结点一定比它的左右孩子小 这种堆称为 最小化堆(小堆) (树根是最小的)
  • (ki >= k2i && ki >= k2i+1) 每个点一定比它的左右孩子大 这种堆称为 最大化堆(大堆) (树根是最大的)

堆排序(以最大化堆为例

堆调整(堆的初始化):排序之前需要将序列调整为 (不满足时 与 左右孩子中较大的那一个进行交换) 从n/2向下取整个点开始由后向前调整直到满足堆条件为止。

排序

  1. 从堆顶取出最大元素 ,堆顶元素与堆的最后一个元素交换位置 (往后就不用考虑当前最后一个元素)。
  2. 对剩余的元素进行调整 , 调整选择剩下元素中的最大元素 (根与左右孩子中较大的那个进行交换直到满足条件为止)即 对进行堆调整。
  3. 重复以上过程 直到序列有序为止 (大堆升序)。

例子 (堆调整过程)

初始序列为: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;
}

数据结构和算法 堆排序 (图解堆调整)相关推荐

  1. 数据结构与算法 | 堆排序

    堆排序 在上一章节里我们完成了堆的实现和基本操作:https://blog.csdn.net/qq_35423154/article/details/104598702 这里就顺带讲一讲堆排序 堆排序 ...

  2. 数据结构与算法——二叉树、堆、优先队列

    *************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 七 ...

  3. 数据结构与算法--二叉堆(最大堆,最小堆)实现及原理

    二叉堆(最大堆,最小堆)实现及原理 二叉堆与二叉查找树一样,堆也有两个性质,即结构性质和堆性质.和AVL树一样,对堆的一次操作必须到堆的所有性质都被满足才能终止,也就是我们每次对堆的操作都必须对堆中的 ...

  4. 数据结构排序算法实验报告_数据结构与算法-堆排序

    堆排序 堆排序是指利用堆这种数据结构所设计的一种排序算法.堆是一个近似完全二叉树的结构,并同时满足堆的性质:即子节点的键值或索引总是小于(或者大于)它的父节点,堆排序的时间复杂度为O(nlogn).( ...

  5. 【数据结构与算法】配对堆的Java实现

    PairingHeap的编程实现 /*** Implements a pairing heap.* Supports a decreaseKey operation.* Note that all & ...

  6. 【数据结构与算法】大根堆和优先队列的Java实现

    异常类 public class TreeException extends RuntimeException {private static final long serialVersionUID ...

  7. Java数据结构与算法(26) - ch12堆(堆实现)

    {TODO} 转载于:https://www.cnblogs.com/thlzhf/p/4089035.html

  8. 【算法】常见数据结构基本算法整理

    去年11月份听了牛客网的课,当时做了纸质的笔记整理. 现在为了以后方便查找,将问题目录整理如下. 每道题只提供解题思路,不贴源代码. 可能会稍微手写一下代码(没有在IDE上测,为了试下以后面试时手写代 ...

  9. 数据结构与算法--面试必问AVL树原理及实现

    数据结构与算法–AVL树原理及实现 AVL(Adelson-Velskii 和landis)树是带有平衡条件的二叉查找树,这个平衡条件必须容易实现,并且保证树的深度必须是O(logN).因此我们让一棵 ...

最新文章

  1. 关于同步加载与异步加载的区别
  2. 尚学python课程---11、linux环境下安装python注意
  3. python2.7怎么升级python3_如何将Mac OS X10.9下的Python2.7升级到最新的Python3.3
  4. 拼多多关联公司申请“碰多多”、“碰碰多”商标
  5. linux启动 mongo 不了问题
  6. PHP 空数组转Json字符串的问题
  7. RedHat Linux RHEL6配置本地YUM源
  8. spring中这些开发技巧真的太diao了
  9. 安全合规/ISO--1--ISO 27000系列标准介绍
  10. 【U8+】用友U816.1版本和天高联用,不显示“实施导航”功能模块
  11. iQOO Neo6 SE什么时候发布 iQOO Neo6 SE配置如何
  12. 利用原生node.js连接sql数据库
  13. c语言erfc函数,erf、erff、erfl、erfc、erfcf、erfcl
  14. 基于特征点检测的人脸融合技术
  15. redis缓存服务器
  16. python进行邮件文件.eml.pst.msg信息提取(包括附件)
  17. 101个CV模型集体开源,魔搭社区视觉AI深度解析
  18. K8S 创建 Deployment
  19. 设置MAC地址和动态IP
  20. EF提示一例对一个或多个实体的验证失败。有关详细信息,请参阅“EntityValidationErrors”属性的解决

热门文章

  1. 泊松随机变量及指数随机变量
  2. html5教学案例撰写,如何撰写教学案例
  3. IntelliJ IDEA 取消import时自动使用通配符
  4. calc与cacls,两个容易混淆的命令
  5. cobbler+kickstart
  6. Linux驱动开发6 阻塞与非阻塞
  7. 使用 python 进行身份证号校验
  8. go语言介绍和开发环境以及git使用
  9. Web下的拒绝服务漏洞(DoS)
  10. 再次携号转网_再次被确认,携号转网必须满足三个要求,网友:转网是最大的坑!...