范沐垚


私信TA

用户名:dotcpp0614554

访问量:3823

签 名:

好大喜功

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

  自我简介:

沽名钓誉

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);  //递归下去
    }
 
}
//向上
void up(int x)
{
   while(x/2&&heap[x/2]>heap[x])
        {
            swap(heap[x/2],heap[x]);
            x/=2;
         }
   return ;
   }
   
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 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换

万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区