基本概念:

堆排序原理和过程强烈推荐看这个up主 请叫我AXin

堆是一种经过排序的完全二叉树,其中任一非终端节点的数据值均不大于(或不小于)其左子节点和右子节点的值。

最大堆和最小堆是二叉堆的两种形式。

最大堆:根结点的键值是所有堆结点键值中最大者。

最小堆:根结点的键值是所有堆结点键值中最小者。

而最大-最小堆集结了最大堆和最小堆的优点,这也是其名字的由来。

最大-最小堆是最大层和最小层交替出现的二叉树,即最大层结点的儿子属于最小层,最小层结点的儿子属于最大层。

以最大(小)层结点为根结点的子树保有最大(小)堆性质:根结点的键值为该子树结点键值中最大(小)项。

代码关键:

1.下标为i的元素,父节点下标为 (i-1)/2

2.下标为i的元素,两个子节点下标为 左孩子:i * 2 + 1 右孩子:i * 2 + 2

3.长度为n的堆数组,从(n-1-1)/2 开始进行堆排序(对应代码中heapify),也就是n/2 - 1

代码:

class Heap {
public:void heapify(vector<int>&arr, int idx, int n){ // 从idx开始调整堆int left = (idx << 1) + 1, right = (idx << 1) + 2; // 孩子节点下标int minIdx = idx;if(left < n && arr[left] < arr[minIdx]) minIdx = left; if(right < n && arr[right] < arr[minIdx]) minIdx = right;if(minIdx != idx){ // 如果孩子节点的值比父节点小,那么久swap然后继续检查孙子节点swap(arr[minIdx], arr[idx]);heapify(arr, minIdx, n);}}void heap(vector<int>&arr, int n){ // 之所以要指定堆大小,是因为arr可能比我们想要的堆更大for(int i = (n >> 1) - 1; i >= 0; --i){ // 堆的大小为n,则从n/2 - 1 开始建堆heapify(arr, i, n);}}
};

做笔记使用。如果有更好的写法还请赐教!!!!溜了溜了~

C++ 手写自建小顶堆相关推荐

  1. 海量数据处理的 Top K算法(问题) 小顶堆实现

    问题描述:有N(N>>10000)个整数,求出其中的前K个最大的数.(称作Top k或者Top 10) 问题分析:由于(1)输入的大量数据:(2)只要前K个,对整个输入数据的保存和排序是相 ...

  2. 数据结构 小顶堆建堆过程 构建过程

    [一]简介 最小堆是一棵完全二叉树,非叶子结点的值不大于左孩子和右孩子的值.本文以图解的方式,说明最小堆的构建.插入.删除的过程.搞懂最小堆的相应知识后,最大堆与此类似. 最小堆示例: [二]最小堆的 ...

  3. 堆排序之 大顶堆和小顶堆 c语言

    百度得到的堆定义如下: 堆的定义如下:n个元素的序列{k1,k2,ki,-,kn}当且仅当满足下关系时,称之为堆. (ki <= k2i,ki <= k2i+1)或者(ki >= k ...

  4. 小顶堆数据结构C/C++代码实现

    相比队列和栈,很多人可能对堆的概念比较陌生,下面个给出堆的本质概念 一.堆也是一种数据结构,从实际应用意义来说,他是一种最优级别数据永远在第一位的队列,本文皆以最小值为例(小顶堆),即它变相是一种会永 ...

  5. 谈谈堆排序,大顶堆,小顶堆

    目录 1.前言 2.使用堆的原因 3.堆的特点 4.堆和普通树的区别 5.堆排序的过程 6.堆排序的代码实现 来源: jianshu.com/p/15a29c0ace73 1.前言 堆是一种非线性结构 ...

  6. 洛谷 P1878 舞蹈课 —— 小顶堆

    This way 题意: 有 n个人参加一个舞蹈课.每个人的舞蹈技术由整数来决定.在舞蹈课的开始,他们从左到右站成一排.当这一排中至少有一对相邻的异性时,舞蹈技术相差最小的那一对会出列并开始跳舞.如果 ...

  7. NO29、最小的K个数(应该记住大顶堆和小顶堆的区别与联系,并不难)

    29.最小的K个数 应该记住大顶堆和小顶堆的区别与联系,并不难 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 示例1 输入 ...

  8. 堆排序:大顶堆和小顶堆 + 前K个高频元素

    堆 一.堆排序 小顶堆 举个栗子 大顶堆 二.前K个高频元素 思路分析 三.构造器代码解析 一.堆排序 要了解大顶堆和小顶堆,我们先简单了解一下堆排序. 堆排序(Heapsort)是指利用堆这种数据结 ...

  9. leetcode 面试题 17.14. 最小K个数 大顶堆 小顶堆 快排

    leetcode 面试题 17.14. 最小K个数 [难度:中等] 设计一个算法,找出数组中最小的k个数.以任意顺序返回这k个数均可. 示例: 输入: arr = [1,3,5,7,2,4,6,8], ...

最新文章

  1. 戴尔科技20.8亿美元出售旗下网络安全业务RSA
  2. 信息安全系统设计基础第五周学习总结
  3. 5G NR — 频率、频段、载波、载频、载波带宽
  4. nginx alias正则表达式
  5. 计算是计算机科学独有的方法,大学计算机基础教学中的计算思维培养.doc
  6. easyexcel模板循环模板怎么循环_雅思大作文怎么熟练套模板
  7. Java中的list、set、map区别
  8. 剑指Offer - 面试题17. 打印从1到最大的n位数
  9. 捷波朗STORM耳机设置中文_2020年 除了Airpods pro以外无线降噪蓝牙耳机如何选?五款热门入耳式蓝牙降噪耳机推荐...
  10. C#中IEnumerable.OfType()方法的简单使用
  11. 上市在即!华为Mate 20 X 5G版证件照公布:国行首款5G手机
  12. Java 原生数据类型、Integer
  13. 1018. 锤子剪刀布 (20)
  14. ExtJs + Struts2 + JSON 程序总结
  15. day05_日常SQL练习(一)
  16. BZOJ3591 最长上升子序列(状压dp)
  17. SpringBoot 2.0.x应用修改默认的端口号
  18. libCef基本框架与结构
  19. SSD算法详解 及其 keras实现 (下)
  20. strictmath_Java StrictMath cbrt()方法与示例

热门文章

  1. 二轮差分模型分析及里程计计算
  2. 高等数学-对无穷小无穷大的理解
  3. android eventbus使用,Android EventBus使用详解(一)
  4. c#设计12星座速配软件_如何用c#制作一款星座查询软件
  5. 猜数字游戏玩玩看,看看你最少能用几次猜出来
  6. 如何生成学籍检验报告
  7. 用JS生成MIDI文件(附代码)
  8. TuGraph开源JAVA客户端工具TuGraph-OGM,无缝对接JAVA开发生态
  9. 小米max刷原生android,小米max标准版 魔趣OS 安卓10 MagiskV21版 完美ROOT 纯净完美 原生极简 纯净推荐...
  10. acwing 850. Dijkstra求最短路(二)堆优化版本