堆模板

39 篇文章 6 订阅
6 篇文章 0 订阅

堆排序

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推销员详细请点这里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值