最大堆

typedef struct HeapStruct *MaxHeap;
struct HeapStruct{
    int *Elements;/* 存储堆元素的数组 */
    int Size;/* 堆的当前元素个数 */
    int Capacity;/* 堆的最大容量 */
};

MaxHeap Create(int MaxSize){
    /* 创建容量为MaxSize的空的最大堆 */
    MaxHeap H = malloc(sizeof(struct HeapStruct));
    H->Elements = malloc((MaxSize+1) * sizeof(int)); 
    H->Size = 0;
    H->Capacity = MaxSize;
    H->Elements[0] = MaxData;
    /* 定义“哨兵”为大于堆中所有可能元素的值,便于以后更快操作 */
    return H;
}

void Insert(MaxHeap H,int item){
    int i;
    if(Isfull(H)){
        cout<<"堆满了"<<endl;
        return;
    }
    i = ++H->Size;
    for(; H->Elements[i/2] < item; i/=2){
        H->Elements[i] = H->Elements[i/2];
    }
    H->Elements[i] = item;
}

int DeleteMax(MaxHeap H){
    int Parent,Child;
    int MaxItem,temp;
    if(Isempty(H)){
        cout<<"最大堆空"<<endl;
        return;
    }
    MaxItem = H->Elements[1];
    temp = H->Elements[H->Size--];
    for(Parent = 1; Parent*2 <= H->Size; Parent = Child){
        Child = Parent * 2;
        if((Child != H->Size)&&
           (H->Elements[Child] < H->Elements[Child+1]))
            Child++;
        if(temp >= H->Elements[Child])break;
        else
            H->Elements[Parent] = H->Elements[child];
    }
    H->Elements[Parent] = temp;
    return MaxItem;
}

最大堆(升序大顶堆, 降序小顶堆)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e7 + 5;
int n, m, k, sum, a[maxn];
string s;
queue<int> q;

void up(int p){
    while(p > 1 && a[p] > a[p / 2]){
        swap(a[p], a[p / 2]);
        p = p / 2;
    }
}

void down(int p){
    while(p * 2 <= n){
        int u = p * 2;
        if(u + 1 <= n && a[u + 1] > a[u]){
            u++;
        }
        if(a[u] > a[p]){
            swap(a[u], a[p]);
            p = u;
        }
        else break;
    }
}

void makeheap(){
    for(int i = n / 2; i >= 1; i--){
        down(i);
    }
}

void push(int x){
    a[++n] = x;
    up(n);
}

int top(){
    return a[1];
}

void pop(){
    swap(a[1], a[n--]);
    down(1);
}

int main(){
    //ios_base::sync_with_stdio(0);
    //cin.tie(); cout.tie();
    n = 10;
    for(int i = 1; i <= n; i++)
        a[i] = i;
    makeheap();
    for(int i = 1; i <= 10; i++){
        push(i + 10);
    }
    while(n > 0){
        cout<<top()<<endl;
        pop();
    }
    return 0;
}

c++

原文链接: https://www.cnblogs.com/acwarming/p/12327122.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    最大堆

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/330284

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月1日 下午5:30
下一篇 2023年3月1日 下午5:30

相关推荐