• 堆的建立


    模板题:

    #include<bits/stdc++.h>
    using namespace std;
    int n,m;
    int a[11];
    void update(int t)
    {
        int i;
        while(t*2<=m)//当这个值还有子节点时进行下列循环    
        {
            if(a[t*2]<a[t])
            {
                i=2*t;
            }//如果左节点比他的父亲节点小,就应该更换左节点
            else i=t;
            if(t*2+1<=m)//如果右节点比左节点和父亲节点都小,则应该交换最小的
            {
                if(a[t*2+1]<a[i])
                {
                    i=2*t+1;
                }
            }
            if(i!=t)//如果要更换的节点不是本身,则应该继续更新
            {
                int temp;
                temp=a[i];
                a[i]=a[t];
                a[t]=temp;
                t=i;
            }
            else break;
    
        }
    }
    void change()
    {
        for(int i=m/2; i>=1; i--)
        {
            update(i);
        }//数组下标从m/2开始而不从m开始的原因是每一次是从父亲节点开始更新,然后将父亲节点和两个子节点进行比较
    }
    void tot()
    {
        while(m>1)
        {
            int temp;
            temp=a[m];
            a[m]=a[1];
            a[1]=temp;
            update(m);
            m--;
        }
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin>>n>>m;
        for(int i=1; i<=m; i++)
        {
            cin>>a[i];
        }//首先输入m个数,建立起初始堆
        int s=m;
        change();//对这一开始的m个数进行排序
        for(int i=m+1; i<=n; i++)
        {
            int x;
            cin>>x;
            if(x>a[1])
            {
                a[1]=x;
                change();
            }
        }
        tot();
        for(int i=1; i<=s; i++)
        {
            //cout<<" "<<a[i]<<" ";
            if(i==1)cout<<a[i];
            else cout<<" "<<a[i];
        }
        cout<<endl;
        return 0;
    }
    
  • 相关阅读:
    QML Image Element
    QML基本可视化元素--Text
    联想笔记本电脑的F1至F12键盘问题。怎么设置才能不按FN就使用F1
    Qt Creator 黑色主题配置
    虚拟机配置
    虚拟机下安装ubuntu后root密码设置
    联想(Lenovo)小新310经典版进bios方法
    带有对话框的父窗口
    添加菜单的窗口
    添加组件的窗口
  • 原文地址:https://www.cnblogs.com/letlifestop/p/10262964.html
Copyright © 2020-2023  润新知