算法导论 6-2 代码实现 C++

D叉堆不同的地方就是父节点和孩子节点在数组中的索引,C++代码,希望不要误人子弟。

复制代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

template <int D> //D叉堆
class Heap_t{
public:
    Heap_t(vector<int> &ptr, int hs);
    int Parent(int i){
        return (i - 1) / D;
    }
    int Child(int i, int k){
        return D*i + k + 1;
    }
    void Insert(int key);
    void Heap_Sort();
    ~Heap_t() {}
private:
    vector<int> &vp; //引用,进行原址操作
    int heap_size;
    void Max_Heapify(int i);
    void Build_Heapify(){
        for (int i = 1; i < heap_size;)
    }
    void Increase_Key(int i, int key);
};
template <int D>
Heap_t<D>::Heap_t(vector<int> &ptr, int hs) :vp(ptr){
    heap_size = 0;
    if (hs >(int) ptr.size())
        exit(0);
    for (int i = 0; i < hs; ++i)
        Insert(vp[i]);
}
template <int D>
void Heap_t<D>::Max_Heapify(int i){
    int largest = i;
    for (int k = 0; k < D; ++k){
        int child = Child(i, k);
        if (child<heap_size&&vp[child]>vp[largest]){
            largest = child;
        }
    }
    if (largest != i){
        vp[i] = vp[i] ^ vp[largest];
        vp[largest] = vp[i] ^ vp[largest];
        vp[i] = vp[i] ^ vp[largest];
        Max_Heapify(largest);
    }
}

template <int D>
void Heap_t<D>::Increase_Key(int i, int key){
    if (key < vp[i])
    {
        cout << "new key is smaller than current key";
        return;
    }
    while (i > 0 && vp[Parent(i)] < key){
        vp[i] = vp[Parent(i)];
        i = Parent(i);
    }
    vp[i] = key;
}

template <int D>
void Heap_t<D>::Insert(int key){
    if (heap_size == vp.size())
        vp.push_back(INT_MIN);
    else vp[heap_size] = INT_MIN;
    Increase_Key(heap_size, key);
    ++heap_size;
}

template <int D>
void Heap_t<D>::Heap_Sort(){
    for (; heap_size > 0; ){
        swap(vp[0], vp[heap_size-1]);
        --heap_size;
        Max_Heapify(0);
    }
}

int main(){
    vector<int> vec = { 1, 12, 8, 11, 5, 4, 3, 5, 66, 2, 1, 1, 3, 4, 45, 2 };
    Heap_t<5> maxh(vec,vec.size());

    for (auto r : vec)
        cout << r<<" ";
    cout << endl;
    maxh.Heap_Sort();
    for (auto r : vec)
        cout << r << " ";
}
复制代码

 

posted on   Natsukashiii  阅读(197)  评论(0编辑  收藏  举报

编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥

导航

< 2025年1月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8

统计

点击右上角即可分享
微信分享提示