堆的应用

堆是一棵完全二叉树

堆:大顶堆 小顶堆

具体代码解释

#include<bits/stdc++.h>

using namespace std;
int heap[100];
int n;

//对heap数组在low high范围进行向下调整
void downAdjust(int low,int high)
{
    //i为欲调整的结点  j为其左儿子
    int i=low;
    int j=i*2;
    while(j<=high){//存在孩子结点
        if(j+1<=high&&heap[j+1]>heap[j]){//右儿子存在并大于左儿子
            j=j+1;
        }
        if(heap[j]>heap[i]){//孩子比父亲大就交换
            swap(heap[j],heap[i]);
            //继续向下 看是否有不符合的
            i=j;
            j=i*2;
        }
        else break;
    }
}


//创建一个大顶堆
void createHeap()
{
    //对于完全二叉树来说 叶节点为n/2向下取整  例如:10->5  11->6
    for(int i=n/2;i>=1;i--){
        downAdjust(i,n);
    }
}

//删除堆顶元素
void deletetop()
{
    heap[1]=heap[n--];
    downAdjust(1,n);
}


//添加一个元素
void upAdjust(int low,int high)
{
    int i=high;
    int j=i/2;
    while(j>=low){
        if(heap[j]<heap[i]){
            swap(heap[j],heap[i]);
            i=j;
            j=i/2;
        }
        else break;
    }
}

void insertt(int x)
{
    heap[++n]=x;
    upAdjust(1,n);
}


//堆排序 最小堆
void heapsort()
{
    createHeap();
    for(int i=n;i>1;i--){
        swap(heap[i],heap[1]);//没次都从i个数中取出堆顶(最大的数)与第i个数交换
        downAdjust(1,i-1);
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&heap[i]);
    }
    createHeap();
    for(int i=1;i<=n;i++) cout<<heap[i]<<endl;
    cout<<"**********************"<<endl;
    insertt(100);
    cout<<"n="<<n<<endl;
    for(int i=1;i<=n;i++) cout<<heap[i]<<endl;

    return 0;
}
/*
10
85 55 82 57 68 92 99 98 66 56
*/
原文地址:https://www.cnblogs.com/chenchen-12/p/10101408.html