例题:将关键字序列1,2,3,4,5,6,7,8,9,10,11, 12,13,14,15,16, 17,18, 19,20建成最大堆
#include<iostream>
using namespace std;
#define N 20
//
//本题是探讨1-20,若探讨1-n,则将20改为n
//
//
int T_swap(int n, int *p)//一个函数,若堆上方小则交换,反之不交换
{
int t = -1;
t = n % 2;
int tmp = n / 2;
switch (t)
{
case 1:
if (p[n] > p[tmp]) {
swap(p[n], p[tmp]);
return 1;
}
return 999;
break;//若只有一个子节点
case 0:
tmp = tmp - 1;
if (p[n] > p[tmp] && p[n] > p[n - 1]) {
swap(p[n], p[tmp]);
return (int)'r';
}
if (p[n - 1] > p[tmp] && p[n] < p[n - 1]) {
swap(p[n - 1], p[tmp]);
return (int)'l';
}
return 999;
break;//若有2个子节点
//若返回999,则代表没有交换
default:
break;
return 898989;//不应该有这个值,如果出现则错误
}
}
int main()
{
int p[N];
for (int i = 0; i < N; i++)
{
p[i] = i + 1;
}//赋值
for (int i = N-1; i > 0; i--)
{
int ii;
int q = i;
do
{
ii = 0;
if (q >= N || ii == 999)break;
ii=T_swap(q, p);
if (q >=N||ii==999)break;
if (ii == (int)'l') {
q = q * 2;
if (q >= N)q = q - 1;
}
if (ii == (int)'r')
{
q = q * 2 + 2;
if (q >= N)q = q - 1;
}
if (ii == 1)q = q * 2 + 1;
} while (ii!=0);//若n节点交换了,则判断n的子节点是否需要交换
}
for (int i = 0; i < N; i++)
{
cout << p[i] << ",";//输出最后的堆
}
}
最终答案为
20,19,15,18,11,13,14,17,9,10,2,12,6,3,7,16,8,4,1,5,