首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++实现二进制堆

在C++中,实现二进制堆的方法如下:

首先,定义一个二进制堆类,包含以下成员变量:

  • 一个std::vector<int>类型的数组,用于存储堆中的元素
  • 一个int类型的变量,表示堆中元素的数量

然后,实现以下成员函数:

  • insert(int value):向堆中插入一个元素
  • extract_min():从堆中取出最小元素
  • decrease_key(int index, int value):将指定位置的元素值减小
  • get_min():获取堆中最小元素

下面是一个简单的实现:

代码语言:cpp
复制
#include<iostream>
#include<vector>

class BinaryHeap {
public:
    BinaryHeap() : size_(0) {}

    void insert(int value) {
        heap_.push_back(value);
        size_++;
        heapify_up(size_ - 1);
    }

    int extract_min() {
        if (size_ == 0) {
            return -1;
        }
        int min_value = heap_[0];
        heap_[0] = heap_[size_ - 1];
        size_--;
        heapify_down(0);
        return min_value;
    }

    void decrease_key(int index, int value) {
        heap_[index] = value;
        heapify_up(index);
    }

    int get_min() {
        if (size_ == 0) {
            return -1;
        }
        return heap_[0];
    }

private:
    void heapify_up(int index) {
        while (index > 0 && heap_[parent(index)] > heap_[index]) {
            std::swap(heap_[index], heap_[parent(index)]);
            index = parent(index);
        }
    }

    void heapify_down(int index) {
        int min_index = index;
        while (2 * index + 1< size_) {
            min_index = 2 * index + 1;
            if (min_index + 1< size_ && heap_[min_index] > heap_[min_index + 1]) {
                min_index++;
            }
            if (heap_[index] <= heap_[min_index]) {
                break;
            }
            std::swap(heap_[index], heap_[min_index]);
            index = min_index;
        }
    }

    int parent(int index) {
        return (index - 1) / 2;
    }

private:
    std::vector<int> heap_;
    int size_;
};

这个实现中,heapify_up()heapify_down()函数分别用于在插入和删除元素时维护堆的性质。parent()函数用于获取指定节点的父节点的索引。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 数据结构——最大索引堆(C++和Java实现)

    在上一篇博客中,记录了优先队列——堆这个数据结构的实现,并且关于堆的性质我也在上文中介绍过,堆能用来进行排序,堆排序具有快速(复杂度O(NlogN)),稳定的特点,尤其是非常稳定,因此适用于某些需要排序稳定性的场合...如果在堆的使用过程中,堆中的元素的值要改变,则普通堆对此无能为力,简单的说,如果一个元素如果进入堆之后,它的值就不能改变了,否则会影响堆的性质。...所谓索引堆,简单的说,就是在堆里头存放的不是数据,而是数据所在的数组的索引,也就是下标,根据数据的某种优先级来调整各个元素对应的下标在堆中的位置。本质上来说,索引堆也是堆,提供堆的接口。...那么接下来,我们就来尝试用C++和J�ava两种语言来实现索引堆,注释在代码中写的比较详细。...C++版如下: #include using namespace std; template class IndexMaxHeap { private

    61110

    左式堆左式堆代码实现

    1 NULL的节点的零路径长为-1,只有一个子节点或没有子节点的节点零路径长为0 左式堆 左式堆是特殊的优先堆,除了有序性(每个节点的数据小于其子节点)以外,还有具有与零路径长相关的性质:对于左式堆,要求任一节点的左子节点零路径长大于等于右子节点的零路径长...操作 合并操作 左式堆的基本操作是合并,合并的递归描述如下: 当输入的两个堆都是空的,输出空堆;当有一个堆是空的,则返回非空的堆 当两个堆非空时,比较两个根节点的大小,返回为: 堆根节点为原较小的根节点...左子树为原较小的跟节点的左子树 右子树为根节点较大的堆和跟节点较小堆右子树合并的结果 如下图所示: ?...merge_op.png 对于最终结果,可能在根节点上出现不符合左式堆的性质的情况,出现这种情况时,交换左右子节点即可: ?...merge_change.png 其他操作 有了核心操作合并,优先堆的其他操作可由合并实现: 插入:通过合并单个节点和现有堆实现 弹出:将根节点返回,并合并左右子堆 代码实现 节点数据结构体 type

    953100

    堆(Heap)的详细实现

    图1] 堆的存储 一般都用数组来表示堆,i结点的父结点下标就为(i–1)/2。...堆的操作:小根堆插入元素 插入一个元素:新元素被加入到heap的末尾,然后更新树以恢复堆的次序。 每次插入都是将新数据放在数组最后。...[图3] 堆的操作:删除小根堆堆的最小元素 按定义,堆中每次都删除第0个数据。为了便于重建堆,实际的操作是将最后一个数据的值赋给根结点,堆的元素个数-1,然后再从根结点开始进行一次从上向下的调整。...这样堆中第0个数据又是堆中最大的数据,重复上述步骤直至堆中只有一个数据时,数组元素就已经有序。...小根堆的实现 #include using namespace std; const int DefaultSize = 50; template class

    1.1K40

    Windows C++堆破坏场景及分析

    那么让我们一起来看看Windows中的堆破坏和分析方法。 堆破坏 在堆>>中比较详细地讲解了堆的结构,这里我们简单说一说堆中对象存储的基本结构。...这里我们问一个问题, 当出现上述堆破坏的时候,堆会直接报错吗? 并不会,因为此时执行的是内存拷贝操作,并不会做堆的任何检查操作。...一般出现堆破坏很大可能是堆的上溢,那么前一个堆块是什么?我们先来看看当前堆块的内容。...这个方法可以帮大家找出一些内存溢出问题,比如查看当前出现错误的堆块对应的操作代码进行审查,但是具有滞后性,无法在堆破坏的时刻保留第一现场,在有些场景分析堆破坏问题仍然非常困难: 比如当前被破坏的堆块,可能是由前面的堆块溢出而导致的破坏...相关阅读 堆>> C++常见的三种内存破的场景和分析>> > 参考 Mario Hewardt / Daniel Pravat的<

    1.3K20

    C++ 自由存储区是否等价于堆?

    “free store” VS “heap” 当我问你C++的内存布局时,你大概会回答: “在C++中,内存区分为5个区,分别是堆、栈、自由存储区、全局/静态存储区、常量存储区”。...然而,尽管C++标准没有要求,但很多编译器的new/delete都是以malloc/free为基础来实现的。那么请问:借以malloc实现的new,所申请的内存是在堆上还是在自由存储区上?...基本上,所有的C++编译器默认使用堆来实现自由存储,也即是缺省的全局运算符new和delete也许会按照malloc和free的方式来被实现,这时藉由new运算符分配的对象,说它在堆上也对,说它在自由存储区上也正确...我们所需要记住的就是: 堆是操作系统维护的一块内存,而自由存储是C++中通过new与delete动态分配和释放对象的抽象概念。堆与自由存储区并不等价。...new所申请的内存区域在C++中称为自由存储区。藉由堆实现的自由存储,可以说new所申请的内存区域在堆上。 堆与自由存储区还是有区别的,它们并非等价。

    3.5K70

    堆的实现与堆排序

    前言 本篇旨在介绍二叉树中特殊结构堆, 以及堆的实现与应用 更多文章 博客主页: 酷酷学!!! 点击关注 一起加油~ 二 . 树的概念及结构 1....将根结点最大的堆叫做最大堆或大根堆,根结点最小的堆叫做最小堆或小根堆。 简单来说, 堆首先是完全二叉树, 如果父节点都比子节点大称为大堆, 父节点比子结点小称为小堆....堆的性质: 堆中某个结点的值总是不大于或不小于其父结点的值; 堆总是一棵完全二叉树。 五 . 堆的实现过程 根据如上所述, 堆逻辑上是二叉树, 物理上可以使用数组来存储. 1....堆排序算法 我们知道, 如果是小堆, 那么堆顶数据一定是最小的元素, 我们可以让数据导入到一个堆中, 然后每次获取堆顶数据, 再删除堆顶数据, 这样确实可以进行排序, 但是这样空间复杂度为O(N),每次排序还需要进行堆的创建...堆的删除操作的时间复杂度为O(logn),其中n为堆中节点的个数。 堆的建立操作的时间复杂度为O(n),其中n为堆中节点的个数。 堆的查找操作的时间复杂度为O(1)。 完

    8010

    用大顶堆实现数据排序

    堆 堆分为大顶堆和小顶堆 大顶堆 每个节点的值都大于或等于其左右孩子节点的值 小顶堆 每个节点的值都小于或等于其左右孩子节点的值 堆排序 堆排序是选择排序的一种,最好最坏平均时间复杂度均为 O(nlogn...),不稳定排序 如何实现大顶堆 比如数组: [4,6,8,5,9] 1. ?...大顶堆排序代码实现 /** * @author shengjk1 * @date 2020/5/31 */ public class HeapSort { public static void...根据升序降序需求选择大顶堆或者小顶堆 for (int i = arr.length / 2 - 1; i >= 0; i--) { adJustHeap(arr, i, arr.length...); } /* 2.将堆顶元素与末尾元素交换,将最大元素沉到数组末端 3.重新调整结构,使其满足堆定义,然后继续交换堆顶元素与当前数组的末尾元素 反复执行 调整交换,直到整个序列有序

    44120
    领券