ヒープ並べ替え(最小ヒープ)
1046 ワード
最小ヒープを利用して数字を並べ替えて、第一行為の数字の個数、第二行為の具体的な数字.14 99 36 7 22 17 46 12 2 19 25 28 1 92
コード:
皬include int h[101]int n;
//交換関数void swap(intx,int y){int t;t=h[x];h[x]=h[y];h[y]=t;
//下方調整関数void siftdown(in t i){int t、flags=0;/iが息子を持っている場合、flags=0を実行すると、サイクルwhile(#2==n&flagge==0){/比較iノードの値とその左息子の値if(h[i]){i 2]){t=i*2;.
//最小ヒープの関数void creat(){int i;for(i=n/2;i>=1;i–){siftdown(i)}
//削除最大のノードint deletemax(){int t]//tは、ルートノードの値(すなわち番号1の値)t=h[1]、//最後のノードの値で、ルートの値h[1]=h[n]、/最後のリーフノードn–を一時的に保存するために使用されます.
int main(){int i,num;//読込ノード数scanf("%d"、&num)//////読込ノード数scanf("%d"、&h[i];;)
試験結果:1 2 5 7 12 17、22、28、36、46、92、99
コード:
皬include int h[101]int n;
//交換関数void swap(intx,int y){int t;t=h[x];h[x]=h[y];h[y]=t;
//下方調整関数void siftdown(in t i){int t、flags=0;/iが息子を持っている場合、flags=0を実行すると、サイクルwhile(#2==n&flagge==0){/比較iノードの値とその左息子の値if(h[i]){i 2]){t=i*2;.
// i
if (i*2+1<=n)
{
// i
if (h[t]>h[i*2+1])
{
t=i*2+1;
}
}
// ,
if (t!=i)
{
swap(t,i);
i=t;
}
else flag=1;
}
)//最小ヒープの関数void creat(){int i;for(i=n/2;i>=1;i–){siftdown(i)}
//削除最大のノードint deletemax(){int t]//tは、ルートノードの値(すなわち番号1の値)t=h[1]、//最後のノードの値で、ルートの値h[1]=h[n]、/最後のリーフノードn–を一時的に保存するために使用されます.
int main(){int i,num;//読込ノード数scanf("%d"、&num)//////読込ノード数scanf("%d"、&h[i];;)
n=num;
// ( : )
creat();
// ,
for (i=1;i<=num;i++)
{
printf("%d ",deletemax());
}
return 0;
)試験結果:1 2 5 7 12 17、22、28、36、46、92、99