最大堆

swim() 表示上浮:作者将其比喻为黑帮新人(插入的新元素),能力高(值大的)的被提升,将能力不够的前辈踩在脚下,直到遇到一个更强的领导。sink ()表示下沉:比喻为黑帮领导,能力不行的或退休的(删除)就被下属取代。每次帮派有新人加入,或有领到退休,帮内都必须重新论资排辈。这个比喻还是挺有意思的。

#include <iostream>
using namespace std;
class MaxHeap
{
private:
    int *a;
    int N;
public:
    MaxHeap(){
        N=0;
    }
    MaxHeap(int n){
        a=new int[n];
        N=0;
    }
    ~MaxHeap(){
        delete a;
    }
    int left(int i)
    {
        return 2*i;
    }
    int right(int i)
    {
        return 2*i+1;
    }
    int parent(int i)
    {
        return i/2;
    }
    bool isEmpty() { return N==0; }
    bool size() { return N; }
    void insert(int val){
        // 这样a[0]是没有存数据的
        //cout<<val<<endl;
        a[++N]=val;
        // 每插入一个数,都调用swim,保持最大堆的性质
        swim(N);
    }
    void swap(int i,int j){
        int temp=a[i];
        a[i]=a[j];
        a[j]=temp;
    }
    int delMax(){
        int maxVal=a[1];
        a[1]=a[N];
        sink(1);
        N--;
        return maxVal;
    }
    void swim(int k){
        while(k>1){
            if(a[parent(k)]<a[k]){
                swap(parent(k),k);
                k=parent(k);
            }
            else break;
        }
    }

    void sink(int k){
        // 将a[k]与子节点中较大的交换
        while(left(k)<=N){
            int j=left(k);
            // 找到子节点中较大的那一个
            if(right(k)<=N && a[left(k)]<a[right(k)]) j=right(k);

            if(a[k]>a[j]) break;
            swap(k,j);
            k=j;
        }
    }

    void show(){
        for(int i=1;i<=N;i++){
            cout<<a[i]<<" ";
        }
        cout<<endl;
    }
};
int main(){
    int a[10]= {3,6,2,7,9,0,8,1,4,5};
    MaxHeap h(100);
    for(int i=0;i<10;i++){
        h.insert(a[i]);
    }
    h.show();
    for(int i=0;i<10;i++){
        cout<<h.delMax()<<" ";
    }
    cout<<endl;
    return 0;
}

最大堆,布布扣,bubuko.com

时间: 2024-10-08 10:09:02

最大堆的相关文章

最小堆_最大堆

在大数查找中会遇到一类问题,例如在100亿条数据中找出 最大的(最小的) 前1000个元素.以int型4Byte为例,有1*1010*4 B = 4*1010/(230) B = 37.25G. 直接读取到内存中显然不合适,那么就需要: 首先,读取前1000个元素,建立一个最小堆(最大堆): 其次,之后每读取一个元素就与最小堆根元素(1000个数中最小值)进行比较: 如果,新元素大于(小于)堆顶元素 则,删除堆顶元素,将新元素插入堆顶.然后调整堆序,删除堆顶....循环往复 #define le

使用Mat分析大堆信息

在定位一线问题时经常碰测试中出现Out Of Memory的问题, 通过jmap查看,发现JVM heap全用满了.有很多工具可以查看JVM堆的信息, 收费的比如JProfiler, YourKit,免费的如Oracle JDK自带的visualvm, jhat和Eclipse MAT.这个应用安装在一台AWS上,没有图形界面, 内存也比较小,想通过VNC远程桌面启动visualvm或者MAT不可能,通过jhat分析dump出来的snapshot(大约4.3G)也很慢,半天没有分析完毕,这种办法

自己实现的一个最大堆

做online judge的时候用到了最大堆,自己实现了一个,不过只适用于unsigned int类型,因为代码量比较小就都写在一起了.看有时间重写一下改成模版类吧. class MaxHeap { private: int heap[MAX]; int len; public: MaxHeap() { len = 0; memset(heap, 0, MAX); } MaxHeap(uint *arr, int n){ len = n; memset(heap, 0, MAX); build(

java 创建最大堆

最大堆的性质是除了根节点之外的所有节点(i)都需要满足A[PARENT(i)]>A[i],即其对应节点值小于其父节点对应值. 下面实现以数组int []a构建最大堆. public class Heap {public static int Left(int i)//返回左子结点{return 2*i+1;} public static int Right(int i)//返回右子节点{return 2*i+2;} public static void Max_Heapify(int []a,i

算法导论——最大堆,以及堆排序算法

本段代码实现了建堆,维护最大堆的性质,堆排序函数,优先队列的相关函数(插入,找最大值,提取出最大值,增加关键值,增加元素),以及相关的测试 1 #include <iostream> 2 #include <memory> 3 #include <iomanip> 4 #define LEFT(i) (2 * i) 5 #define RIGHT(i) (2*i + 1) 6 #define PARENT(i) (i >> 1) 7 8 using name

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 /*********

堆排序:什么是堆?什么是最大堆?二叉堆是什么?堆排序算法是怎么样的?PHP如何实现堆排序?

本文标签:  堆排序 php php算法 堆排序算法 二叉堆 数据结构 REST   服务器 什么是堆 这里的堆(二叉堆),指得不是堆栈的那个堆,而是一种数据结构. 堆可以视为一棵完全的二叉树,完全二叉树的一个"优秀"的性质是,除了最底层之外,每一层都是满的,这使得堆可以利用数组来表示,每一个结点对应数组中的一个元素. 数组与堆之间的关系 二叉堆一般分为两种:最大堆和最小堆. 什么是最大堆 堆中每个父节点的元素值都大于等于其孩子结点(如果存在),这样的堆就是一个最大堆 因此,最大堆中的

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

[Java Web] 1\Web开发初识——一大堆历史和技术名词

LZ前言 LZ最近发现网络真是个神奇的东西,以前做的好玩的只能自娱自乐(或者说顾影自怜),现在只要发一个帖子,写一个博客,很快能引来一大群小伙伴的围观(有时候还能遇见几个大牛给个战略性的指导)...LZ本来是搞硬件的:从CPU的制造(VHDL).数电.模电再到计算机组成原理.汇编.接口技术,底层的东西算是走马观花地懂了点皮毛,正好大一的时候又了解一点计算机的编程知识(当时第一次用C++Build写出来个Hollo World那个欣喜呀~后来又从win32学到MFC再到C#,嘿嘿,基本上还是皮毛吧