最大堆/最小堆/优先队列 实现代码(c++)

自我感觉代码写的比较乱,这方面要好好注意一下。

总结:

1.在使用vector<int>::size_type 类似的类型时,千万要注意循环的条件判断,很容易发生溢出的危险!所以我最后很懒的选择使用int  - -。

2.下标表示和元素个数表示之间的细微差别。下标之间的变换关系:

父节点 parent(i)=(i-1)/2; 左孩子 left(i)=2*i+1;右孩子 right(i)=2*i+2

class Max_Heap{
    typedef int index;
public:
    Max_Heap(const vector<int> &vec) :v(vec){
        Build_Heapify(v);
    }
    ~Max_Heap(){};
    void Heap_Sort();
    int Heap_Max() { return v[0]; }
    int Heap_Extract_Max();
    void Insert(int key);
private:
    vector<int> v;
    void Max_Heapify(vector<int> &vec, index i, int hs);
    void Build_Heapify(vector<int> &vec);
};

void
Max_Heap::Max_Heapify(vector<int> &vec, index i, int hs){
    int l = 2 * i + 1, r = 2 * i + 2;
    int largest = i;
    if (l < hs&&vec[l] > vec[i])
        largest = l;
    if (r < hs&&vec[r] > vec[largest])
        largest = r;
    if (largest != i){
        swap(vec[i], vec[largest]);
        Max_Heapify(vec, largest, hs);
    }
}

void
Max_Heap::Build_Heapify(vector<int> &vec){
    int hs = vec.size();
    for (int i = (hs / 2) - 1; i >= 0; --i)
        Max_Heapify(vec, i, hs);
}

void
Max_Heap::Heap_Sort(){
    int hs = v.size();
    Build_Heapify(v);
    for (int i = hs - 1; i >= 0; --i){
        swap(v[0], v[i]);
        Max_Heapify(v, 0, i);
    }
}
int
Max_Heap::Heap_Extract_Max() {
    if (v.size() == 0)
    {
        std::cout << "over flow";
        return 0;
    }
    else {
        int temp = v[0];
        swap(v[0], v[v.size() - 1]);
        v.pop_back();
        Max_Heapify(v, 0, v.size());
        return temp;
    }
}
void
Max_Heap::Insert(int key){
    v.push_back(key);
    int sz = v.size();
    while (sz>=2&&key > v[sz / 2 - 1]){
        swap(v[sz - 1], v[sz / 2 - 1]);
        sz = sz / 2;
    }
}
时间: 2024-10-09 18:31:13

最大堆/最小堆/优先队列 实现代码(c++)的相关文章

Black Box--[优先队列 、最大堆最小堆的应用]

Description Our Black Box represents a primitive database. It can save an integer array and has a special i variable. At the initial moment Black Box is empty and i equals 0. This Black Box processes a sequence of commands (transactions). There are t

最小堆的维护,POJ(2051)

题目链接:http://poj.org/problem?id=2051 ///维持最小堆(优先队列)POJ2051 #include <iostream> #include <string> using namespace std; struct Node { int Now; ///出堆的时间 int id; int p; ///时间间隔 }; Node node [3001]; int K; ///输出个数 void down (Node H[],int s,int m) {

最小堆(优先队列)基本概念,即一个完整建立,插入,删除代码

堆(优先队列)priority queue特殊的队列,取出元素的顺序是依照元素的优先权(关键字)大小,而出元素进入队列的先后顺序操作:查找最大值(最小值),删除(最大值) 数组:链表:有序数组:有序链表: 采用二叉搜索树? NO 采用完全二叉树 YES堆的连个特性结构性:用数组表示的完全二叉树:有序性:任一结点的关键字是其字树所有结点的最大值(或最小值) 最大堆(MaxHeap)也称大顶堆:最大值 最小堆(MinHeap)也称"小顶堆":最小值 从根节点到任意结点路径上结点序列的有序性

优先队列及最小堆最大堆

为什么优先队列里默认是堆(heap)实现,默认是优先级高的出队,定义结构体重载函数为什么要按照从小到大排序?原来是自己对优先队列还不太了解: 1 堆 1.1 简介 n个关键字序列Kl,K2,-,Kn称为(Heap),当且仅当该序列满足如下性质(简称为堆性质): (1)ki<=k(2i)且ki<=k(2i+1)(1≤i≤ n),当然,这是小根堆,大根堆则换成>=号.//k(i)相当于二叉树的非叶结点,K(2i)则是左孩子,k(2i+1)是右孩子 若将此序列所存储的向量R[1..n]看做是一

Google 面试题:Java实现用最大堆和最小堆查找中位数 Find median with min heap and max heap in Java

Google面试题 股市上一个股票的价格从开市开始是不停的变化的,需要开发一个系统,给定一个股票,它能实时显示从开市到当前时间的这个股票的价格的中位数(中值). SOLUTION 1: 1.维持两个heap,一个是最小堆,一个是最大堆. 2.一直使maxHeap的size大于minHeap. 3. 当两边size相同时,比较新插入的value,如果它大于minHeap的最大值,把它插入到minHeap.并且把minHeap的最小值移动到maxHeap. ...具体看代码 1 /*********

hdu 4006 The kth great number (优先队列+STB+最小堆)

The kth great number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) Total Submission(s): 6637    Accepted Submission(s): 2671 Problem Description Xiao Ming and Xiao Bao are playing a simple Numbers game. In a roun

优先队列的实现(最小堆)

使用最小堆实现优先队列 定义上浮函数和下浮函数,对每一次加入的新节点,重新维护最小堆 代码: public class PriorityMinQueue { private int[] arr; private int size; /** * 返回优先队列的大小 * * @return */ public int Size() { return size; } public PriorityMinQueue() { this(20); } /** * 初始化优先队列 * * @param cap

数据结构-最大堆、最小堆【手动实现】

0,堆的简介 数据结构中的堆是一种特殊的二叉树,不同于 Java 内存模型中的堆. 堆必须符合以下两个条件: 是一棵完全二叉树. 任意一个节点的值都大于(或小于)左右子节点的值. 从第一点可以知道,堆适合用数组来存储. 第二点中,若父节点都大于等于左右子节点,则被称为大顶堆,反之则为小顶堆. 图-最大堆及其存储方式 0.1节点的父.子节点关系 一个节点[根节点除外]的父节点地址为其地址的二分之一,它的左子节点地址为其地址值的2倍,右子节点地址为其地址2倍加1.  例如:现在有个节点的地址为3,其

通用的最小堆(最大堆)D-ary Heap

听说有一种最小(大)堆,不限于是完全二叉树,而是完全D叉树,名为D-ary Heap(http://en.wikipedia.org/wiki/D-ary_heap).D可以是1,2,3,4,100,对于优先队列该有的功能都没有问题. 动手写一个D-ary Heap,应该不难.简单起见,不考虑像STL一样通过template传入Comp类,下面的实现要求T类型重载了operator <和operator >. template<class T> class DaryHeap { s