小根堆

<span style="font-size:24px;">const
  maxn=1000;
var
  n,l,i,temp:longint;
  a:array[0..maxn] of longint;
  procedure put(x:longint);
var
  son,temp:longint;
begin
  inc(l);
  a[l]:=x;
  son:=l;
  while (son<>1) and (a[son div 2]>a[son]) do
     begin
       temp:=a[son];
       a[son]:=a[son div 2];
       a[son div 2]:=temp;
       son:=son div 2;
     end;
end;
   function get:longint;
var
  fa,son,temp:longint;
  stop:boolean;
begin
  get:=a[1];
  a[1]:=a[l];
  dec(l);
  fa:=1;
  stop:=false;
  while (fa*2<=l) and (not stop) do
    begin
      if (fa*2+1>l) or (a[fa*2]<a[fa*2+1])</span><span style="font-size:32px;color:#ff0000;">//两个判断一定不能反!</span><span style="font-size:24px;">
      then son:=fa*2
      else son:=fa*2+1;
      if a[fa]>a[son]
      then begin
             temp:=a[fa];</span><pre name="code" class="delphi">
 

大根堆

<span style="font-size:32px;">const
  maxn=1000;
var
  n,l,i,temp:longint;
  a:array[0..maxn] of longint;
  procedure put(x:longint);
var
  son,temp:longint;
begin
  inc(l);
  a[l]:=x;
  son:=l;
  while (son<>1) and (a[son div 2]<a[son]) do
     begin
       temp:=a[son];
       a[son]:=a[son div 2];
       a[son div 2]:=temp;
       son:=son div 2;
     end;
end;
   function get:longint;
var
  fa,son,temp:longint;
  stop:boolean;
begin
  get:=a[1];
  a[1]:=a[l];
  dec(l);
  fa:=1;
  stop:=false;
  while (fa*2<=l) and (not stop) do
    begin
      if (fa*2+1>l) or (a[fa*2]>a[fa*2+1])<span style="color: rgb(255, 0, 0); ">//两个判断一定不能反!</span>
      then son:=fa*2
      else son:=fa*2+1;
      if a[fa]<a[son]
      then begin
             temp:=a[fa];
             a[fa]:=a[son];
             a[son]:=temp;
             fa:=son;
           end
      else stop:=true;
    end;
end;
begin
  read(n);
  l:=0;
  for i:=1 to n do
    begin
      read(temp);
      put(temp);
    end;
  for i:=1 to n do
    writeln(get);
end.
</span>

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值