将二叉树进行排序,使得每个节点小于它的左右子节点,这样的二叉树称为最小堆。
在对二叉树进行排序时,要将节点与左右子节点进行比较,找到最小值并与节点交换,并且不断的向下进行排序。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN = 10005;
int num[MAXN];
int K;
void siftdown(int i)
{
int t;
bool flag = false;
while(i * 2 <= K && flag == false)
{
if(num[i] > num[i * 2])
t = i * 2;
else
t = i;
if(i * 2 + 1 <= K)
if(num[t] > num[i * 2 + 1])
t = i * 2 + 1;
if(i != t)
{
int temp = num[i];
num[i] = num[t];
num[t] = temp;
i = t;
}
else
flag = true;
}
}
void creat(int n)
{
K= n;
for(int i = K / 2; i > 0; i--)
siftdown(i);
}
int deletemin()
{
int ans = num[1];
num[1] = num[K];
K--;
siftdown(1);
return ans;
}
int main()
{
int n;
while(~scanf("%d", &n))
{
for(int i = 1; i <= n; i++)
scanf("%d", &num[i]);
creat(n);
for(int i = 1; i <= n; i++)
printf("%d ", deletemin());
printf("\n");
}
return 0;
}
写的过程中Bug成堆,对着讲解对比了好久才终于搞懂了