数据结构与算法--堆

news/2024/7/7 20:46:02

 最小堆C++实现:(可以插入一个数、删除最小值)

#include <iostream>
using namespace std;

const int DefaultSize = 1000005;

template<class T>
class MinHeap{
    T* heap;
    int currentSize;
    int maxHeapSize;
    void siftDown(int start);
    void siftUp(int start);

public:
    MinHeap(int sz=DefaultSize);
    MinHeap(T arr[], int n);
    ~MinHeap(){delete[] heap;}
    bool Insert(const T& x);
    bool Remove();
    void Print();
    T get_min() const {if(currentSize!=0) return heap[0]; return 0;}
    bool IsEmpty() const {return currentSize==0;}
    bool IsFull() const {return currentSize==maxHeapSize;}
    int get_maxHeapSize() const {return maxHeapSize;}
    int get_currentSize() const {return currentSize;}
};

template<class T>
MinHeap<T>::MinHeap(int sz){
    if(sz<DefaultSize) sz=DefaultSize;
    heap = new T[sz];
    currentSize = 0;
    maxHeapSize = sz;
}

template<class T>
MinHeap<T>::MinHeap(T arr[], int n){
    int sz = n*2;
    if(sz<DefaultSize) sz=DefaultSize;
    heap = new T[sz];
    for(int i=0;i<n;i++) heap[i] = arr[i];
    currentSize = n;
    maxHeapSize = sz;
    int start = (currentSize-1-1)/2;
    while(start>=0){
        siftDown(start);
        start--;
    }
}

template<class T>
void MinHeap<T>::siftDown(int start){
    int i=start, j=i*2+1;
    int temp=heap[i];
    while(j<=currentSize-1){
        if(j+1<=currentSize-1&&heap[j+1]<heap[j]) j++;
        if(temp<=heap[j]) break;
        heap[i]=heap[j];
        i=j;
        j=i*2+1;
    }
    heap[i]=temp;
}

template<class T>
void MinHeap<T>::siftUp(int start){
    int j=start, i=(j-1)/2;
    int temp=heap[j];
    while(j>0){
        if(heap[i]<=temp) break;
        heap[j]=heap[i];
        j=i;
        i=(j-1)/2;
    }
    heap[j]=temp;
}

template<class T>
void MinHeap<T>::Print(){
    for(int i=0;i<currentSize;i++){
        cout<<heap[i]<<" ";
    }
    cout<<endl;
}

template<class T>
bool MinHeap<T>::Insert(const T& x){
    if(currentSize==maxHeapSize){
        cerr<<"Heap Full"<<endl;
        return false;
    }
    heap[currentSize] = x;
    siftUp(currentSize);
    currentSize++;
    return true;
}

template<class T>
bool MinHeap<T>::Remove(){
    if(currentSize==0){
        cerr<<"Heap Empty"<<endl;
        return false;
    }
    heap[0]=heap[currentSize-1];
    currentSize--;
    siftDown(0);
    return true;
}

int main()
{
    MinHeap<int> hp;
    int n;cin>>n;
    for(int i=1;i<=n;i++){
        int op;cin>>op;
        if(op==1){
            int num;cin>>num;
            hp.Insert(num);
        }
        else if(op==2){
            cout<<hp.get_min()<<endl;
        }
        else{
            hp.Remove();
        }
    }
    return 0;
}

堆可以维护一组数中的最大值/最小值

参考:

最小堆c++实现_c++手写最小堆_Andy Dennis的博客-CSDN博客


http://lihuaxi.xjx100.cn/news/1288453.html

相关文章

ElasticSearch 8.0+ 版本Windows系统启动

下载地址&#xff1a;https://www.elastic.co/cn/downloads/past-releases/winlogbeat-8-8-1 解压\elasticsearch\elasticsearch-8.5.1 进入bin目录&#xff0c;启动elasticsearch.bat 问题1&#xff1a; warning: ignoring JAVA_HOMED:\jdk1.8.0_271; using bundled JDK J…

CUGBACM22级暑假小学期训练-二分,二分答案

CUGBACM22级暑假小学期训练-二分,二分答案 A - A-B 数对 题意&#xff1a;找 A − B C A-BC A−BC的对数&#xff0c;已知 C C C&#xff0c;那么就是找对于每个数就是找 C B CB CB的数量 思路&#xff1a;二分找位置最大的 C B CB CB与位置最小的 C B CB CB&#xff0c…

leetcode474. 一和零(动态规划-java)

一和零 leetcode474. 一和零题目描述解题思路解法一 递归加缓存动态规划代码演示 动态规划专题 leetcode474. 一和零 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/ones-and-zeroes 题目描述 给你一个二进制字符串数组…

GO 交叉编译(跨平台编译)

起初是我编译成.exe文件时遇到了与64的平台系统不兼容这个问题&#xff0c;然后我进行了查询资料才知道&#xff0c;想要打包成别的平台能够正确运行的程序&#xff0c;需要保证架构的问题&#xff0c;下面我只是对我查询资料的一个总结&#xff0c;我踩了坑&#xff0c;希望后…

安泰电子:ATA-M210高压放大器模块技术参数

Aigtek安泰电子年度新品ATA-M210高压放大器模块已经上市&#xff0c;本篇将针对ATA-M210高压放大器模块&#xff0c;进行技术指标及特点方面的介绍。 为了满足自身高压放大性能不变&#xff0c;体积小&#xff0c;集成度高的客户需求及市场需要&#xff0c;ATA-M210高压放大器模…

回波数据adc_data.bin解析(附MATLAB程序)

毫米波雷达系统性能参数分析 1、xWR1642—DCA1000 TI目前有两款采集卡TSW1400和DCA1000&#xff0c;可以为xWR1243/1443和1642毫米波雷达进行回波数据采集。本文将主要介绍几款雷达分别用2款采集卡数据采集的回波数据格式以及MATLAB数据解析程序。 1、xWR1642—DCA1000 &…

macOS编译AirMap开源全景图源码image-processing

1.克隆源码 git clone --recursive https://github.com/airmap/image-processing.git 2. 使用CLion打开CMakeLists.txt并做为工程打开 2.默认配置名为Default,可修改,下面的所有配置项都可改 3.点击OK后会自动生成

javaee CURD优化

在之前的博客中&#xff0c;我们每个操作都创建了一个servlet&#xff0c;其实可以把这些操作都写到一个servlet里面。 但是这种写法&#xff0c;需要很多Switchcase&#xff0c;有没有办法&#xff0c;传过来的方法名是什么就自动调用对应的方法呢&#xff0c;可以的&#xff…