堆排序
var
a,b:array[1..200000] of longint;
i,n,num:longint;
procedure up(x:longint);
var
t:longint;
begin
while (x>1)and(a[x]<a[x div 2]) do
begin
t:=a[x];
a[x]:=a[x div 2];
a[x div 2]:=t;
x:=x div 2;
end;
end;
procedure down(x:longint);
var
t,y:longint;
begin
while ((2*x<=num)and(a[x]>a[x*2]))or((2*x<=num+1)and(a[x]>a[x*2+1])) do
begin
y:=2*x;
if (y+1<=num)and(a[y]>a[y+1]) then inc(y);
t:=a[x];
a[x]:=a[y];
a[y]:=t;
x:=y;
end;
end;
procedure insert(x:longint);
begin
inc(num);
a[num]:=x;
up(num);
end;
procedure delete(x:longint);
begin
if a[num]>a[x]
then begin a[x]:=a[num]; dec(num); down(x); end
else begin a[x]:=a[num]; dec(num); up(x); end;
end;
procedure build;
var
i:longint;
begin
num:=0;
for i:=1 to n do insert(a[i]);
end;
begin
assign(input,'dui.in'); reset(input);
assign(output,'dui.out'); rewrite(output);
read(n);
for i:=1 to n do read(a[i]);
build;
for i:=1 to n do
begin
b[i]:=a[1];
delete(1);
end;
for i:=1 to n do writeln(b[i]);
close(input); close(output);
end.
难一点的题目:noip2015推销员详细请点这里