堆的定义如下:
n个元素的序列{k0,k1,...,ki,…,k(n-1)}当且仅当满足下关系时,称之为堆。
" ki=k2i,ki>=k2i+1.(i=1,2,…,[n/2])"
若将和此次序列对应的一维数组(即以一维数组作此序列的存储结构)看成是一个完全二叉树,
则完全二叉树中每一个节点的值的都大于或等于任意一个字节的值(如果有的话),称之为大顶堆。
则完全二叉树...
分类:
编程语言 时间:
2015-07-30 09:32:27
阅读次数:
152
堆其实是一个完全二叉树堆分为大顶堆和小顶堆(index从0开始哦)大顶堆:key[i]>=key[2i+1]&&key[i]>=key[2i+2],大堆顶的关键字肯定是所有关键字中最大的小顶堆:key[i]<=key[2i+1]&&key[i]<=key[2i+2],小顶堆的堆顶的关键字是所有关键字...
分类:
编程语言 时间:
2015-07-28 12:52:22
阅读次数:
118
堆排序是一种树形选择排序,是对直接选择排序的有效改进。
堆是一种数据结构,其定义:任何一个非叶结点的值,都不大于(或不小于)其左右孩子结点的值。若父亲大孩子小,则这样的堆叫做大顶堆;若父亲小孩子大,则这样的堆叫做小顶堆。顾名思义,大顶堆的根结点的值是最大的,小顶堆的根结点的值是最小的。基本思想首先,将一个无序序列调整为大顶堆(小顶堆),我们就找到了这个无序序列的最大(或最小)值,然后将这个值交换到...
分类:
编程语言 时间:
2015-07-18 11:03:33
阅读次数:
142
堆排序相对冒泡这些要复杂一些,它需要先初始化堆。.net里List的排序就混合使用了堆排序和快速排序。出于学习目的,代码示范里不使用数组结构,数组比较深涩。而使用嵌套类来实现。1.初始化堆排序肯定是有升序和降序两种,堆排序也一样,分为大顶堆和小顶堆。初始化堆的目的就是变为大顶堆或者小顶堆传统的方法是...
分类:
编程语言 时间:
2015-07-17 20:34:48
阅读次数:
200
【堆排序的思路】堆排序主要是利用了堆的性质,对于大顶堆:堆中的每个节点的值都不小于它的孩子节点的值...
分类:
编程语言 时间:
2015-07-16 11:53:12
阅读次数:
156
2015-07-16问题简述: 动态求取中位数的问题,输入一串数字,每输入第奇数个数时求取这些数的中位数。 原题链接:http://poj.org/problem?id=3784解题思路: 求取中位数的方法常常想到使用堆来实现:取一个大顶堆,一个小顶堆,使大顶堆的堆顶记录中位数,因此,要时刻保...
分类:
其他好文 时间:
2015-07-16 11:21:56
阅读次数:
101
【大顶堆的性质】大顶堆是一棵完全二叉树,且树中的每个节点的值都不小于它的孩子节点的值。我们可以用一个heap数组来表示它。【大顶堆的插入、删除】
大顶堆的插入:首先初始化插入位置为最后,然后从下往上调整堆(调整插入元素的位置)。在调整过程中,若当前节点的父亲节点小于插入元素,则将其父亲节点的值赋给当前节点,父亲节点作为当前节点,依此继续;否则当前节点即为插入位置。
大顶堆的删除:删除根,初始化最后一...
分类:
编程语言 时间:
2015-07-14 17:58:44
阅读次数:
330
堆真是一种简单而又神奇的数据结构,以前用它求过前kth的数,现在又可以用两个堆来动态求解中位数。算法: 构建一个大顶堆和一个小顶堆,分别记为g和l。 假设当前中位数为mid,新读入一个数为tmp,则: 1.如果tmp = mid,则将tmp插入小顶堆,跳到步骤4。 3.如果大顶堆的元素个数比...
分类:
其他好文 时间:
2015-07-14 15:00:42
阅读次数:
93
1.算法介绍 堆排序是一种树形选择排序,是对直接选择排序的有效改进。 堆实际上是一棵完全二叉树,其任何一非叶节点满足性质:Key[i]=Key[2i+1]&&key>=key[2i+2] 即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。 堆分为大顶堆和小顶堆,满足Key[i]...
分类:
编程语言 时间:
2015-07-12 20:20:51
阅读次数:
161
/**堆排序*/
/**顺序表存储*/
#include
#include
#define LT(a,b) ((a)<(b))
using namespace std;
int a[]={9,5,2,1,3,4,6,8,9,10};
int n=5;
void f(int s,int m){
/**使a[s...m]成为一个大顶堆*/
int c = a[s];
for(i...
分类:
编程语言 时间:
2015-06-28 00:08:36
阅读次数:
202