欢迎使用本站,预祝练习时长两年半的选手们到成功! [本模块信息来自tem/def/head]

sgyq wzh yzo 堆

时间:2024-05-12 11:12 作者:admin 点击:
#include iostream using namespace std; //小顶堆 //10 20 12 27 30 15 16 90 40 60 45 32 小顶 //90 60 32 40 45 15 16 27 20 30 10 12 大顶 int n=12; void put(int x){ //放置x点 int k=x*2; if(k+1=nsz[k+1]sz[k]) k++; if(sz[x]sz[k]){ swap(

#include <iostream>

using namespace std;

//小顶堆&大顶堆

int sz[1000]={0,60,30,15,27,45,32,16,90,40,20,10,12};

//10 20 12 27 30 15 16 90 40 60 45 32 小顶

//90 60 32 40 45 15 16 27 20 30 10 12 大顶

int n=12;

void put(int x){

   //放置x点

   int k=x*2;

   if(k+1<=n&&sz[k+1]<sz[k]) k++;

   if(sz[x]>sz[k]){

       swap(sz[x],sz[k]);

       if(k*2<=n) put(k);

   }

   //跟左右子节点比较

   //如果交换了,看新的位置是否需要放置【递归】

}

void put2(int x){

   int k=x*2;

   if(k+1<=n&&sz[k+1]>sz[k]) k++;

   if(sz[x]<sz[k]){

       swap(sz[x],sz[k]);

       if(k*2<=n) put2(k);

   }

}

int main(){

   //从倒数第一个有子节点的节点开始,向根节点遍历

   for(int i=n/2;i>=1;i--){

       //将当前节点放置到正确的位置

       put(i);

   }

   for(int i=1;i<=n;i++) cout<<sz[i]<<" ";cout<<endl;

   for(int i=n/2;i>=1;i--){

       put2(i);

   }

   for(int i=1;i<=n;i++) cout<<sz[i]<<" ";

   return 0;

}

(责任编辑:admin)
    顶一下
    (0)
    0%
    踩一下
    (0)
    0%