范沐垚


私信TA

用户名:dotcpp0614554

访问量:5223

签 名:

好大喜功

等  级
排  名 196
经  验 6616
参赛次数 0
文章发表 87
年  龄 18
在职情况 学生
学  校 看今夜 小楼灯宴
专  业 尽是良辰美眷

  自我简介:

沽名钓誉

解题思路:    首先初始化堆(从小到大),然后每次输出堆首元素 

注意事项:    更新堆时要注意比较的方式

参考代码:

#include<iostream>
using namespace std;
const int N=100010;
int heap[N],n,sizea;
void down(int k)
{
    int t=k; 
    // 注意最后比较要用heap[t]
    if(2*k<=sizea&&heap[2*k]<heap[t])     //左儿子存在并且左儿子的值小
        t=2*k;
    if(2*k+1<=sizea&&heap[2*k+1]<heap[t])    //右儿子存在并且右儿子的值小
        t=2*k+1;
    if(t!=k){
        swap(heap[k],heap[t]);      //存在某个儿子的值小  交换
        down(t);  //递归下去
    }

}
int main(void)
{
    cin>>n;
    sizea=n;
    for(int i=1;i<=n;i++)
        cin>>heap[i];
    for(int i=n/2;i;i--)
        down(i);                 //初始化堆
        while(n--)
        {
            cout<<heap[1]<<' ';    //heap[1]即为栈中最小的
            //删除heap[1] 更新堆
            heap[1]=heap[sizea];
            sizea--;
            down(1);
        }
        cout<<endl;
    return 0;
}


 

0.0分

1 人评分

  评论区

  • «
  • »