实现C++小根堆

// 手写小根堆
template<typename T>
class lyhMinHeap{
public:
    lyhMinHeap(int size = 10){
        maxSize = size;
        heap = new T[maxSize];
        curSize = 0;
    }

    bool Insert(const T& x){// 插入新的元素。若输入8,因为8是个右值,形参需要加const 修饰
        if(curSize >= maxSize){
            cout << "满了" << endl;
            return false;
        }
        heap[curSize] = x;
        siftUp(curSize);
        curSize++;
        return true;
    }

    void output(){
        for(int i = 0; i < curSize; i++)
            cout << heap[i] << ", ";
        cout << endl;
    }

    bool RemoveMin(T& x){ // 弹出堆顶,即最小元素
        if(curSize <= 0){
            cout << "empty!!" << endl;
            return false;
        }
        x = heap[0];
        heap[0] = heap[curSize-1];
        curSize--;
        siftDown(0,curSize-1);
        return true;
    }

private:
    T* heap; // 数组模拟堆
    int curSize; // 当前堆中元素数量
    int maxSize; // 堆最大可容纳元素数量

    void siftUp(int start){ // 辅助上移
        int cur = start;
        int parent = (cur+1)/2 -1;
        T temp = heap[cur];
        while(parent >= 0){
            if(heap[parent] > temp){
                heap[cur] = heap[parent];
                cur = parent;
                parent = (cur+1)/2 -1;
            }else
                break;
        }
        heap[cur] = temp;
    }

    void siftDown(int start, int end){ // 辅助下移
        int cur = start;
        int lc = 2*cur +1;
        T& temp = heap[cur];
        while(lc <= end){
            if(lc+1 <= end && heap[lc+1] < heap[lc]) lc++;
            if(heap[lc] < temp){
                heap[cur] = heap[lc];
                cur = lc;
                lc = 2*cur +1;
            }else  
                break;
        }
        heap[cur] = temp;
    }
};
posted @   子于舟  阅读(351)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示