堆数据结构

以下是小根堆定义,包括向堆中插入元素,删除堆中元素,建立新堆,调整堆等函数。

typedef int Elemtype;
class MinHeap{
public:
    MinHeap() :elem(0), size(0){}
    void BuildMinHeap(vector<Elemtype> v);
    void Modify(int i);
    int Delete();
    void Insert(Elemtype e);
private:
    vector<Elemtype> elem;
    int size;
};

void MinHeap::BuildMinHeap(vector<Elemtype> v)
{
    elem = v;
    size = v.size();
    int i = size / 2;
    while (i > 0){
        Modify(i);
        i--;
    }
}

void MinHeap::Modify(int i)
{
    Elemtype temp = elem[i];
    int parent, child;
    for (parent = i; parent * 2 <= size; parent = child){
        child = parent * 2;
        if (child + 1 <= size&&elem[child + 1] < elem[child])
            child++;
        if (elem[child] > temp)
            break;
        else
            elem[parent] = elem[child];
    }
    elem[parent] = temp;
}

void MinHeap::Insert(Elemtype e)
{
    elem.push_back(e);
    int i;
    i = ++size;
    for (; elem[i / 2] > e; i /= 2){
        elem[i] = elem[i / 2];
    }
    elem[i] = e;
}

int MinHeap::Delete()
{
    Elemtype temp = elem[1];
    elem[1] = elem[size--];
    elem.pop_back();
    Modify(1);
    return temp;
}
时间: 2024-11-09 03:05:41

堆数据结构的相关文章

堆 (数据结构)

堆 (数据结构)[工程下载>>>] 堆(英语:Heap)是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵树的数组对象.在队列中,调度程序反复提取队列中第一个作业并运行,因为实际情况中某些时间较短的任务将等待很长时间才能结束,或者某些不短小,但具有重要性的作业,同样应当具有优先权.堆即为解决此类问题设计的一种数据结构. 1.1 逻辑定义 n个元素序列k1,k2...ki...kn,当且仅当满足下列关系时称之为堆: (ki<=k2i,ki<=k2i+1)或者(k

堆数据结构+堆排序+最大优先队列的堆的实现

对于堆排序,首先要先知道什么是堆数据结构,堆数据结构就是一个完全二叉树,但是它有自己的性质. 例如最大堆的性质为:A[PARENT[i]]>=A[i]:即每一个结点的值大于等于其左右孩子的值,小于等于其父节点的值.我们在这里只讨论最大堆的情况.我们知道一颗完全二叉树对应一个最大堆的形式,我们要做的就是将二叉树转化为最大堆,这就是所谓的最大堆的维护,我们定义函数MaxheapFY(A,i)来进行操作. 代码: /** *MaxheapFY(A,i):维护位置i最大堆性质,此时假设left(i)和r

【上海交大oj】合并果子(堆数据结构)

4012. 合并果子 Description 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了.多多在合并果子时总共消耗的体力等于每次合并所耗体力之和. 因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力.假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计

从一个集合中查找最大最小的N个元素——Python heapq 堆数据结构

Top N问题在搜索引擎.推荐系统领域应用很广, 如果用我们较为常见的语言,如C.C++.Java等,代码量至少也得五行,但是用Python的话,只用一个函数就能搞定,只需引入heapq(堆队列)这个数据结构即可.今天偶然看到这个库,特意记下之. 先看一个例子: 1 >>> import heapq 2 >>> nums = [1,8,2,23,7,-4,18,23,42,37,2] 3 >>> print heapq.nlargest(3, nums

优先队列(堆) -数据结构(C语言实现)

数据结构与算法分析 优先队列 模型 Insert(插入) == Enqueue(入队) DeleteMin(删除最小者) == Dequeue(出队) 基本实现 简单链表:在表头插入,并遍历该链表以删除最小元 时间代价昂贵 二叉查找树 二叉查找树支持许多不需要的操作,实现麻烦,不值得 最合适:二叉堆 二叉堆 堆的两种性质 结构性 完全二叉树:除底层外完全填满,底层也是从左至右填 完全二叉树的高为 log N 分布很有规律可以用数组实现 左儿子 = 2i 右儿子 = 2i + 1 堆序性 树的最小

二叉堆-数据结构-JavaScript版

/** * Created by caoke on 2015/11/21. */ //二叉树 特点父节点比子节点小 var Tree2=function(){ //初始化 二叉树的子元素 this.children=[]; } Tree2.prototype={ size:0, push:function(x){ var arr=this.children //自己节点的编号 var i=arr.length while(i>0){ //父节点的编号 var p=parseInt((i-1)/2

数据结构之堆(Heap)的实现

堆数据结构是一种数组对象,它可以被视为一棵完全二叉树结构,所以堆也叫做二叉堆. 二叉堆满足二个特性: 1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值. 2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆). 当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆.当父结点的键值总是小于或等于   任何一个子节点的键值时为最小堆. 最大堆和最小堆是堆数据结构的重点.堆排序中使用特别的多. 堆的存储一般是用一个数组实现的,当然也可以用链式存储,但是特别麻烦. 如下我

D&amp;F学数据结构系列——二叉堆

二叉堆(binary heap) 二叉堆数据结构是一种数组对象,它可以被视为一棵完全二叉树.同二叉查找树一样,堆也有两个性质,即结构性和堆序性.对于数组中任意位置i上的元素,其左儿子在位置2i上,右儿子在左儿子后的单元2i+1中,它的父亲在[i/2](向下取整)中. 因此,一个数据结构将由一个数组.一个代表最大值的整数.以及当前的堆的大小组成.一个典型的优先队列(priority queue)如下: 1 #ifndef _BinHeap_H 2 struct HeapStruct; 3 type

数据结构学习——堆

1 基本介绍 堆数据结构是一种数组对象,它可以被视为一颗完全二叉树.堆的访问可以通过三个函数来进行即, parent(i) return floor(i/2); left(i) return 2i; right(i) return 2i + 1; left操作可以通过一步左移操作完成,right操作可以通过左移并在地位+1实现,parent操作则可以通过把i右移一位得到.在实现中通常会使用宏或者内联函数来实现这三个操作. 二叉堆有两种,最大堆和最小堆.对于最大堆有 A[i] >= A[left(