zoukankan      html  css  js  c++  java
  • 堆的应用

    堆是一棵完全二叉树

    堆:大顶堆 小顶堆

    具体代码解释

    #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
    */
  • 相关阅读:
    33. 搜索旋转排序数组
    54. 螺旋矩阵
    46. 全排列
    120. 三角形最小路径和
    338. 比特位计数
    746. 使用最小花费爬楼梯
    spring boot的一些常用注解
    SSM整合Dubbo案例
    一些面试题
    Spring Aop和Spring Ioc(二)
  • 原文地址:https://www.cnblogs.com/chenchen-12/p/10101408.html
Copyright © 2011-2022 走看看