完全二叉树之所以用数组的方式存在,在于他的一个特性 若子节点为i,则父节点为(i-1)/2,注意c++特性,该结果肯定是个整数。

若父节点为j,则子节点必为2*j+1;则在数组里面可以非常方便的通过下标去获取。

建堆的核心思想:

  堆在index的值为heap[index],然后其两个孩子的值边可求得,左孩子为heap[index*2+1],右孩子为heap[index*2+2]。

首先比较左边孩子与右边孩子,获取较小值的孩子,然后让heap[index]与值较小的孩子进行比较。若值小则交换值,并且移动index到值较小孩子的位置,否则退出调整。

下面看代码,有注释:

#pragma once
template<class T>
class JBMinHeap
{
private:
//申请堆空间
T *_minHeap = NULL;
int _index,_maxSize;
public:
JBMinHeap(int maxSize) {
_maxSize = maxSize;
_minHeap = new T[_maxSize];
_index = -;
}
JBMinHeap(JBMinHeap &h) {
_index = h._index;
_maxSize = h._maxSize;
_minHeap = new T[_maxSize];
for (int i = ;i<_maxSize) {
*_minHeap[i] = *h._minHeap[i];
}
}
~JBMinHeap() {
delete[]_minHeap;
}
//获取整个最小堆的头部指针
T * getMinHeap() {
return _minHeap;
}
//判断堆是不是空的
bool isEmpty() {
return _index == -;
}
bool add(T x) {
if (isFull()) {
return false;
}
_index++;
_minHeap[_index] = x;
return true;
}
bool isFull() {
return _index == _maxSize;
}
//堆进行向下调整
void adjustDown(int index);
//队进行向上调整
void adjustUp(int index);
//建堆运算
void createMinHeap() {
if (isEmpty()) {
return;
}
for (int i = (_index-)/;i >-;i--) {//直接从倒数第二层 逐层向下调整
adjustDown(i);
}
}
};
template<class T>
void JBMinHeap<T>::adjustDown(int index) {
if (isEmpty()) {
return;
}
while (index<_index)
{
T temp = _minHeap[index];//将当前索引的位置的值保存下来
int oneC = * index + ;//获取到两个孩子的位置
int twoC = * index + ;
if (oneC == _index) {//若第一个孩子是整个堆最后一个位置 则直接执行交换操作并结束执行
_minHeap[index] = _minHeap[oneC];
_minHeap[oneC] = temp;
return;
}
if (twoC >_index) {//如果第二个孩子的索引位置越界 结束执行
return;
}
if (_minHeap[oneC] <= _minHeap[twoC]) {//正常情况的数据交互执行
if (temp > _minHeap[oneC]) {
_minHeap[index] = _minHeap[oneC];
_minHeap[oneC] = temp;
index = oneC;
}
else {//如果该处索引值已经是比两个孩子小 则结束循环
index = _index;
}
}
else
{
if (temp > _minHeap[twoC]) {
_minHeap[index] = _minHeap[twoC];
_minHeap[twoC] = temp;
index = twoC;
}
else
{
index = _index;
}
}
}
}
template<class T>
void JBMinHeap<T>::adjustUp(int index) {
if (index > _index) {//大于堆的最大值直接return
return;
}
while (index>-)
{
T temp = _minHeap[index];
int father = (index - ) / ;
if (father >= ) {//若果索引没有出界就执行想要的操作
if (temp < _minHeap[father]) {
_minHeap[index] = _minHeap[father];
_minHeap[father] = temp;
index=father;
}
else {//若果已经是比父亲大 则直接结束循环
index = -;
}
}
else//出界就结束循环
{
index = -;
}
}
}

主程序:

#include "stdafx.h"
#include"stdlib.h"
#include"JBQueue.h"
#include"JBStack.h"
#include"JBBinaryTree.h"
#include"JBMinHeap.h" int main()
{
{
JBMinHeap<int> jb();
jb.add();
jb.add();
jb.add();
jb.add();
jb.add();
jb.add();
jb.createMinHeap();
int *p=jb.getMinHeap();
printf("整理为最小堆:\n");
for (int i = ;i < ;i++) {
printf("%d\n",p[i]);
}
}
system("pause");
return ;
}

数据结构之最小堆的实现C++版的更多相关文章

  1. 《徐徐道来话Java》:PriorityQueue和最小堆

    在讲解PriorityQueue之前,需要先熟悉一个有序数据结构:最小堆. 最小堆是一种经过排序的完全二叉树,其中任一非终端节点数值均不大于其左孩子和右孩子节点的值. 可以得出结论,如果一棵二叉树满足 ...

  2. 【数据结构】通用的最小堆(最大堆)D-ary Heap

    听说有一种最小(大)堆,不限于是完全二叉树,而是完全D叉树,名为D-ary Heap(http://en.wikipedia.org/wiki/D-ary_heap).D可以是1,2,3,4,100, ...

  3. Jcompress: 一款基于huffman编码和最小堆的压缩、解压缩小程序

    前言 最近基于huffman编码和最小堆排序算法实现了一个压缩.解压缩的小程序.其源代码已经上传到github上面: Jcompress下载地址 .在本人的github上面有一个叫Utility的re ...

  4. Python3实现最小堆建堆算法

    今天看Python CookBook中关于“求list中最大(最小)的N个元素”的内容,介绍了直接使用python的heapq模块的nlargest和nsmallest函数的解决方式,记得学习数据结构 ...

  5. 最小堆实现优先队列:Python实现

    最小堆实现优先队列:Python实现 堆是一种数据结构,因为Heapsort而被提出.除了堆排序,“堆”这种数据结构还可以用于优先队列的实现. 堆首先是一个完全二叉树:它除了最底层之外,树的每一层的都 ...

  6. Java最小堆解决TopK问题

    TopK问题是指从大量数据(源数据)中获取最大(或最小)的K个数据. TopK问题是个很常见的问题:例如学校要从全校学生中找到成绩最高的500名学生,再例如某搜索引擎要统计每天的100条搜索次数最多的 ...

  7. libevent中最小堆实现算法解析

    libevent,一个非常好的c的网络库,最近开始学习并分析下,做个记录.源码选用的1.4版本.因为感觉这版的代码比较精简,也没有太多宏定义,个人感觉适合学习原理. 从哪里开始呢,我选择从一些最简单的 ...

  8. c++/java/python priority_que实现最大堆和最小堆

    #include<iostream>#include<vector>#include<math.h>#include<string>#include&l ...

  9. 最大堆 最小堆 解决TOPK问题

    堆:实质是一颗完全二叉树,最大堆的特点:父节点值均大于子节点:最小堆的父节点值均小于子节点: 一般使用连续内存存储堆内的值,因而可以根据当前节点的索引值推断子节点的索引值: 节点i的父节点为(i-1) ...

随机推荐

  1. 001-python3 初识

    一.python的起源 python是一门 解释型弱类型编程语言. 特点: 简单.明确.优雅 二.python的解释器 CPython. 官方提供的. 内部使用c语言来实现 PyPy. 一次性把我们的 ...

  2. web前端css(三)

    一 . 文本属性和字体属性(常用) 1.    文本属性 text-align: left, right, enter, justify(两端对齐,只适用于英文);   /*对齐方式*/ color: ...

  3. Spring的<context:annotation-config>和<annotation-driven>

    <context:annotation-config>  相对于注册 AutowiredAnnotationBeanPostProcessor.CommonAnnotationBeanPo ...

  4. Java虚拟机详解(三)------垃圾回收

    如果对C++这门语言熟悉的人,再来看Java,就会发现这两者对垃圾(内存)回收的策略有很大的不同. C++:垃圾回收很重要,我们必须要自己来回收!!! Java:垃圾回收很重要,我们必须交给系统来帮我 ...

  5. 关于红黑树(R-B tree)原理,看这篇如何

    学过数据数据结构都知道二叉树的概念,而又有多种比较常见的二叉树类型,比如完全二叉树.满二叉树.二叉搜索树.均衡二叉树.完美二叉树等:今天我们要说的红黑树就是就是一颗非严格均衡的二叉树,均衡二叉树又是在 ...

  6. JAVA面试题 手写ArrayList的实现,在笔试中过关斩将?

    面试官Q1:可以手写一个ArrayList的简单实现吗? 我们都知道ArrayList是基于数组实现,如果让你实现JDK源码ArrayList中add().remove().get()方法,你知道如何 ...

  7. 关于Markdown编辑器的基本使用规则

    @TOC 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页.如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown ...

  8. exgcd、二元一次不定方程学习笔记

    (不会LATEX,只好用Word) ( QwQ数论好难) 再补充一点,单次询问a,b求逆元的题可以直接化简然后套用exgcd求解. 例题:https://www.luogu.org/problemne ...

  9. 洛谷P3275 [SCOI2011]糖果 题解

    题目链接: https://www.luogu.org/problemnew/show/P3275 分析: 本题就是一个裸的差分约束. 核心: x=1x=1x=1时,a=b,a−>b,b−> ...

  10. Excel催化剂开源第47波-Excel与PowerBIDeskTop互通互联之第一篇

    当国外都在追求软件开源,并且在GitHub等平台上产生了大量优质的开源代码时,但在国内却在刮着一股收割小白智商税的知识付费热潮,实在可悲. 互联网的精神乃是分享,让分享带来更多人的受益. 在Power ...