c++ 最大/最小堆

本文介绍了一种使用完全二叉树的数组存储方法来实现最小堆的数据结构。通过插入和删除操作调整节点位置,确保堆的性质得以维持。文章提供了具体的C++实现代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用完全二叉树的数组存储方法

用二叉搜索树(binary search tree)来实现

插入时,在最后插入,用上调操作,把节点调置相应位置

删除时,删除根节点值,以最后一个节点填补根节点,再用下调操作,把其调制相应位置

 

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn= 1000010;

class MinHeap{
public:
    MinHeap(int sz= maxn);
    MinHeap(int arr[], int n);
    void push(int x);
    void pop();
    bool empty(){
        return currentSize > 0;
    }
    int front(){
        return heap[0];
    }
    int size(){
        return currentSize;
    }
    void clear(){
        currentSize= 0;
    }
private:
    int *heap;
    int currentSize, maxSize;
    void shiftDown(int start, int m);
    void shiftUp(int start);
};
MinHeap::MinHeap(int sz){
    heap= new int[sz];
    currentSize= 0;
}
MinHeap::MinHeap(int arr[], int n){
    maxSize= n;
    heap= new int [maxSize];
    for(int i= 0; i<n; i++)heap[i]= arr[i];
    currentSize= n;
    int currentPos = currentSize/2 -1;
    while( currentPos >= 0){
        shiftDown(currentPos, currentSize -1);
        currentPos--;
    }
}
void MinHeap :: shiftDown(int start, int m){
    int i= start, j= 2*i + 1;
    int tmp= heap[i];
    while( j<= m){
        if( j<m && heap[j] > heap[j+1]) j++;
        if( tmp < heap[j]) break;
        else {
            heap[i]= heap[j];
            i= j;
            j= 2*j+ 1;
        }
        heap[i]= tmp;
    }
}
void MinHeap::shiftUp(int start){
    int j= start, i= (j-1)/2;
    int tmp = heap[j];
    while( j> 0){
        if( heap[i] <= tmp) break;
        else{
            heap[j]= heap[i];
            j= i;
            i= (i-1)/2;
        }
        heap[j]= tmp;
    }
}
void MinHeap::push(int x){
    heap[currentSize]= x;
    shiftUp(currentSize);
    currentSize++;
}
void MinHeap::pop(){
    heap[0]= heap[currentSize-1];
    currentSize--;
    shiftUp(currentSize-1);
}
int main(){
    MinHeap p(10000);
    p.push(2);
    p.push(3);
    p.push(5);
    cout<<p.front()<<endl;
    cout<<p.size()<<endl;
    p.pop();
    cout<<p.front()<<endl;
    p.clear();
    cout<<p.size();
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值