自己实现的一个最大堆

做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(arr, n);
    }
    int parent(int i){
        return i / 2;
    }
    int left(int i){
        return i * 2;
    }
    int right(int i){
        return i * 2 + 1;
    }
    void heapify(int i){
        int l = left(i);
        int r = right(i);
        int largest;
        if (l <= len && heap[l] > heap[i]){
            largest = l;
        }
        else{
            largest = i;
        }
        if (r <= len && heap[r] > heap[largest]){
            largest = r;
        }
        if (largest != i){
            swap(heap[i], heap[largest]);
            heapify(largest);
        }
    }
    void build(uint *arr, int n){
        for (int i = 0; i < n; ++i){
            heap[i + 1] = arr[i];
        }
        for (int i = len / 2; i >= 1; i--){
            heapify(i);
        }
    }
    uint maximum(){
        return heap[1];
    }
    uint extractMax(){
        if (len < 1)cout << "error, returning -1" << endl;
        uint max = heap[1];
        heap[1] = heap[len];
        len--;
        heapify(1);
        return max;
    }
    void increaseKey(int i, uint key){
        if (key < heap[i]){
            cout << "new key is samller than current key" << endl;
            return;
        }
        heap[i] = key;
        while (i > 1 && heap[parent(i)] < heap[i]){
            swap(heap[i], heap[parent(i)]);
            i = parent(i);
        }
    }
    void insert(uint key){
        len++;
        heap[len] = 0;
        increaseKey(len, key);
    }
    int length(){
        return len;
    }
    void print(){
        for (int i = 1; i <= len; i++){
            cout << heap[i] << endl;
        }
    }
};
时间: 2024-10-01 03:56:14

自己实现的一个最大堆的相关文章

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

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

数据结构c++语言描述&mdash;&mdash;最大堆(MaxHeap)

一.最大堆的插入 图9-3a 给出了一个具有5个元素的最大堆.由于堆是完全二叉树,当加入一个元素形成6元素堆时,其结构必如9-3b 所示.如果插入元素的值为1,则插入后该元素成为2的左孩子,相反,若新元素的值为5,则该元素不能成为2的左孩子(否则将改变最大树的特性),应把2下移为左孩子(如图9 - 3 c所示),同时还得决定在最大堆中5是否占据2原来的位置.由于父元素20大于等于新插入的元素5,因此可以在原2所在位置插入新的元素.假设新元素的值为21而不是5,这时,同图9-3c 一样,把2下移为

《github一天,一个算术题》:堆算法接口(堆排序、堆插入和堆垛机最大的价值,并删除)

阅览.认为.编写代码! /********************************************* * [email protected] * blog: http://blog.csdn.net/hustyangju * 题目:堆排序实现,另外实现接口:取堆最大值并删除.堆插入 * 思路:堆是在顺序数组原址上实现的.利用全然二叉树的性质.更具最大堆和最小堆的定义实现的. * 经典应用场景:内存中堆数据管理 * 空间复杂度:堆排序是在原址上实现的,为0 * 时间复杂度:堆排序为

堆排序和建立最大堆

堆是完全二叉树的结构,因此对于一个有n个节点的堆,高度为O(logn). 最大堆:堆中的最大元素存放在根节点的位置. 除了根节点,其他每个节点的值最多与其父节点的值一样大.也就是任意一个子树中包含的所有节点的值都不大于树根节点的值. 堆中节点的位置编号都是确定的,根节点编号为1,每一层从左到右依次编号.由堆是完全二叉树,可以知道当堆中某个节点的编号为i时,如果这个节点有左右子树,那么左子树的节点编号为2*i,右子树的节点编号为2*i+1(当然这是在根节点编号为1的情况时). 并且有n个节点的堆中

最大堆(最小堆)

最大堆是一种很有用的数据结构,它是一颗完全二叉树,并且如果一个节点有儿子节点,其关键字都不小于其儿子节点的关键字.(最小树反之:节点值不大于儿子节点的完全二叉树.) 最大堆使用的一个典型的地方就是找出无序数字中,最大的一个数字.比如100亿整数中找出最小的前100个数字,典型的解决方案之一就是:先去处前边一百个值,创建一个最大堆,然后顺序读入的剩下的每个值,如果值小于根节点值,则删除根节点,把这个值插入,重建最大堆.重复这过程.最后就得到了最小的前100个数字(如果找前100个最大的值,就建立一

排序--最大堆构造和堆排序(单步查看过程)

这里先简单说下最大堆的基本性质: 最大堆一定是完全二叉树 当父节点为 n 时,左孩子为 n * 2 + 1,右孩子为 n * 2 + 2 当孩子为 n 时,其父节点为: (n - 1) / 2 ----> 这一点很重要,在后面初始化的时候会用到 父节点大于等于左孩子和右孩子,但左孩子不一定大于右孩子 了解以上基本性质之后,就可以先看一下如何对一个序列做最大堆的初始化. 最大堆的构造 思路:过程就像冒泡一样,从最序号最大的父节点开始,查看是否满足最大堆,如果不满足,则调整(调整之后,还要查看被调整

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

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

数据结构中的堆

一:堆排序      堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种.可以利用数组的特点快速定位指定索引的元素.堆分为大根堆和小根堆,是完全二叉树.大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i].在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶.下面附上简单C#简单实现: using System; using System.Collections.Generi

leetcode笔记:Find Median from Data Stream

一. 题目描述 Median is the middle value in an ordered integer list. If the size of the list is even, there is no middle value. So the median is the mean of the two middle value. Examples: [2,3,4] , the median is 3 [2,3], the median is (2 + 3) / 2 = 2.5 De