二叉堆:

  以前写过二叉堆,但很少使用,快忘了。最近又查了一些关于堆的资料,于是重新熟悉一下这种数据结构。

  一个快速又简单的方式建立二叉堆,仅使用简单vector(或者数组也行):

#include "stdafx.h"
#include <iostream>
#include <vector> #define LeftChild(i) ((i << 1) | 1)
#define RightChild(i) (i << 1) template<class T>
void swap(T & a, T & b)
{
T tem = a;
a = b;
b = tem;
} class Heap {
public:
/* 上滤插入 */
void up_insert(int val, std::vector<int> & values, int top); /* 调用上滤插入建立堆 */
void up2build(std::vector<int> & values); /* 下滤插入 */
void down_insert(std::vector<int> & values, int i, int size); /* 调用下滤插入建立堆 */
void down2build(std::vector<int> & values); /* 堆排序 */
void sort(std::vector<int> & values);
}; void Heap::up_insert(int val, std::vector<int> & values, int top)
{
size_t i;
for (i = top; i > 0 && values[i >> 1] < val; i >>= 1)
values[i] = values[i >> 1];
values[i] = val;
} void Heap::up2build(std::vector<int> & values)
{
int top = 0;
for (auto v : values)
{
up_insert(v, values, top);
++top;
}
} void Heap::down_insert(std::vector<int> & values, int i, int size)
{
int last = values[i];
for (int Child; LeftChild(i) < size; i = Child)
{
Child = LeftChild(i);
if (Child != size - 1 && values[Child + 1] > values[Child])
Child++; if (last < values[Child])
values[i] = values[Child];
else
break;
}
values[i] = last;
} void Heap::down2build(std::vector<int> & values)
{
int size = values.size() - 1;
for (int i = size >> 1; i >= 0; i--)
{
down_insert(values, i, size);
}
} void Heap::sort(std::vector<int> & values)
{
int size = values.size() - 1;
down2build(values);
for (int i = size; i > 0; i--)
{
swap(values[0], values[i]);
down_insert(values, 0, i);
}
} int main()
{
Heap heap;
std::vector<int> values { 5345,332,2341,498,248,89,239,4825,8,43,9892,872,1843 }; //heap.build(values);
heap.sort(values); for (auto v : values)
std::cout << v << std::endl; getchar();
return 0;
}

  up_build是形如‘上滤’的过程,平均情况时间复杂度为θ(n),因为up_insert函数平均只花费θ(1)的时间。空间复杂度O(n);

  down_build是形如‘下滤’的过程,时间复杂度为O(nlgn),空间复杂度O(n)。

 左式堆:

  左式堆的性质:任意节点的左孩子的NPL(null path length - 零路径长)至少等于右孩子的NPL,这样的条件使得左式堆十分不平衡。左式堆的基本操作是进行堆合并。

  NPL的定义:任一节点到叶节点的最短路径的长。

  参考资料:

    1.《数据结构与算法分析》第6章 - 堆。

    2.知乎相关问题

heap(堆)的更多相关文章

  1. Heap堆的理解以及在IAR中如何设置堆的大小

    文章首发于浩瀚先森博客 堆栈的概念在脑海里已经存在有一段时间了,今天就测试来整理下Heap堆.栈以后再说. 堆区不像全局变量和局部变量总是有指定的内存大小,它是为了在程序运行时动态分配内存而设定的一块 ...

  2. java - Stack栈和Heap堆的区别

    首先分清楚Stack,Heap的中文翻译:Stack—栈,Heap—堆.         在中文里,Stack可以翻译为“堆栈”,所以我直接查找了计算机术语里面堆和栈开头的词语:        堆存储 ...

  3. Heap(堆)和stack(栈)有的区别是什么。

    java的内存分为两类,一类是栈内存,一类是堆内存.栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这个 ...

  4. JAVA Stack栈和Heap堆的区别(转)

          首先分清楚Stack,Heap的中文翻译:Stack—栈,Heap—堆.         在中文里,Stack可以翻译为“堆栈”,所以我直接查找了计算机术语里面堆和栈开头的词语:      ...

  5. 逻辑运算符、三元运算符、for循环、stack(栈),heap(堆),方法区,静态域

    Lesson One 2018-04-17 19:58:39 逻辑运算符(用于逻辑运算,左右两边都是 true 或 false) 逻辑与-& 和 短路与-&& 区别: & ...

  6. Stack栈 Heap堆

    Stack(栈) 栈(stack) 又名堆栈,它是一种运算受限的线性表.其限制是仅允许在表的一端进行插入和删除运算.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进栈.入栈或压栈 ...

  7. linux heap堆分配

    heap堆分配在用户层面:malloc函数用于heap内存分配 void* malloc(size_t size); 进程的虚拟内存地址布局: 对用户来说,主要关注的空间是User Space.将Us ...

  8. 如何给女朋友讲明白:Java 中 Stack(栈) 与 Heap(堆)

    背景 Java 中 Stack(栈) 与 Heap(堆) 是面试中被经常问到的一个话题. 有没有对 Java 中 Stack(栈) 与 Heap(堆) 烂熟于心的童鞋,请举手!!!(怎么没人举手-) ...

  9. Delphi 堆栈 [ heap(堆) 和 stack(栈) ]

    程序需要的内存空间分为 heap(堆) 和 stack(栈); heap(堆) 是自由存储区, stack(栈) 是自动存储区; 使用 heap 需要手动申请.手动释放, 使用 stack 是自动申请 ...

  10. 栈 堆 stack heap 堆内存 栈内存 内存分配中的堆和栈 掌握堆内存的权柄就是返回的指针 栈是面向线程的而堆是面向进程的。 new/delete and malloc/ free 指针与内存模型

    小结: 1.栈内存 为什么快? Due to this nature, the process of storing and retrieving data from the stack is ver ...

随机推荐

  1. 吴裕雄 python 机器学习——数据预处理流水线Pipeline模型

    from sklearn.svm import LinearSVC from sklearn.pipeline import Pipeline from sklearn import neighbor ...

  2. TensorFlow:使用inception-v3实现各种图像识别

    程序来自博客: # https://www.cnblogs.com/felixwang2/p/9190740.html上面这个博客是一些列的,所以可以从前往后逐一练习. # https://www.c ...

  3. 创建jsp文件时报错,"javax.servlet.http.HttpServlet" was not found on the Java)

    原因: 创建jsp文件的步骤如下: 出现"javax.servlet.http.HttpServlet" was not found on the Java) 报错信息就是因为没有 ...

  4. netty学习1

    1.IO java 自带IO流 1)同步处理方式,一个请求占用一个线程,高并发常见出现问题 2.java nio 实在jdk1.4版本上新添加的new IO / 非阻塞IO 可多路并发 3.Netty ...

  5. laravel 报错The Mix manifest does not exist.

    这是因为我们在 resources/views/layouts/app.blade.php 中使用 mix() 方法,而我们还未运行 Laravel Mix 进行编译,找不到 mix-manifest ...

  6. linux开机启动项问题。6版本与7版本不同之处 。

    参考 网址:https://blog.csdn.net/weixin_41909810/article/details/82775247

  7. ASA设置某些log不发送到log server

    If you want to suppress a specific syslog message to be sent to syslog server, then you must enter t ...

  8. IPSec的链路和设备备份

    链路备份的IPSec VPN和设备备份的IPSec VPN:首先实验的是链路备份的  IPSec VPN,下面是实验拓扑: IP地址配置:R1(Branch):Branch(config-if)#ip ...

  9. [BPNN]BP神经网络概念

    BP神经网络概念 BP神经网络的计算过程: 由正向计算过程和反向计算过程组成: 正向计算过程,输入模式从输入层经隐单元层逐层处理,并转向输出层,每一层神经元的状态只影响下一层神经元的状态.如果在输出层 ...

  10. rem在三星s5部分机型情况下 设置的字体大小与手机实际字体大小不一致问题

    rem在三星s5部分机型情况下 设置的字体大小与手机实际字体大小不一致问题 判断是特殊机型,做特殊处理. var u=navigator.userAgent; if($(window).width() ...