我说的是最大堆(即从大到小排)
初始堆即最大的元素在第一个,其他元素任意排(但是满足父节点大于子节点)
var i,n:longint;
a:array[1..1000] of longint;
procedure ex(var x,y:longint);
var k:longint;
begin
k:=x;x:=y;y:=k;
end;
procedure down(i,l:longint);
var t:longint;
begin
t:=i*2;
while t<=l do
begin
if (t
if a[t]>a[i] then
begin
ex(a[t],a[i]);
i:=t;t:=i*2;
end
else break;
end;
end;
begin
readln(n);
for i:=1 to n do read(a[i]);
readln;
for i:=n div 2 downto 1 do down(i,n);
for i:=n downto 2 do
begin
write(a[1],' ');
a[1]:=a[i];
down(1,i-1);
end;
writeln(a[1]);
end.
初始堆是空的,要把数据建进去的。
看看书或网上搜索一下
看看书或网上搜索一下就可以了吗
,,,,,
初建堆是按照第一次排序完成“取出堆顶元素”步骤 得到初始堆
初始堆就像一个完全二叉树一样,根部就是数组中最大或最小的元素
我们从初始堆的取出堆顶并输出,
然后将最后一个结点抽取到顶部 ,再完成“取出堆顶元素”步骤, 生成新的初始堆
再从初始堆的取出堆顶并输出
以此循环到数组全部元素都取出