建堆操作

Posted 最爱小崔同学

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了建堆操作相关的知识,希望对你有一定的参考价值。

//建堆操作 
#include<iostream>
#include<algorithm>
using namespace std;
const int N=100010;
int n,m;
int h[N],size;
void down(int u)

    int t=u;//储存最小值下标 
    if(u*2<=size&&h[u*2]<h[t]) t=2*u;
    if(u*2+1<=size&&h[u*2+1]<h[t]) t=2*u+1;
    if(u!=t)
    
        swap(h[u],h[t]);
        down(t);
    

void up(int u)

    while(u/2&&h[u/2]>h[u])
    
        swap(h[u/2],h[u]);
        u=u/2;    //迭代操作;
     

int main()

    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",&h[i]);
    size=n;
    for(int i=n/2;i;i--) down(i);
    while(m--)
    
        printf("%d ",h[1]);
        h[1]=h[size];
        size--;
        down(1);
    
    return 0;

以上是关于建堆操作的主要内容,如果未能解决你的问题,请参考以下文章

建堆是O(n)的复杂度证明

自建堆排序:

c++ 手写堆 (包括建堆排序添加元素删除元素)

堆排序

批量建堆(二叉堆完全二叉堆)~~批量建堆

建堆复杂度O(n)证明