一个关于堆的程序(树)

自己做了一个关于堆的程序,输入方法如下:读入一个n,代表结点个数,然后依次读入n个结点,再然后读入1或2或3或4:1代表删除一个结点,然后你要读入要删除的结点;2代表删除首结点;3代表插入一个新节点,然后你需要读入要插入的结点;4代表对堆进行排序。



程序:
const
  maxn=100;
type
  arr=array[1..maxn]of longint;
var
  h:arr;
  n,p,q,x:longint;

procedure siftup(var lr:arr;i:longint);
  var
    done:boolean;
    t:longint;
  begin
    if i=1 then exit;
    repeat
      done:=false;
      if h[i]>h[i div 2] then begin t:=h[i]; h[i]:=h[i div 2]; h[i div 2]:=t; end
        else done:=true;
      i:=i div 2;
    until (i=1) or done;
end;

procedure siftdown(var h:arr;n,i:longint);
  var
    done:boolean;
    t:longint;
  begin
    done:=false;
    if 2*i>n then exit;
    repeat
      i:=2*i;
      if (i+1<=n) and (h[i+1]>h[i]) then inc(i);
      if h[i div 2]
        else done:=true;
      until (2*i>n) or done;
end;

procedure heapinsert(var h:arr; var n:longint;x:longint);
  begin
    inc(n);
    h[n]:=x;
    siftup(h,n);
end;

procedure heapdelete(var h:arr; var n:longint; i:longint);
  var
    x,y:longint;
  begin
    x:=h[i];
    y:=h[n];
    dec(n);
    if i=n+1 then exit;
    h[i]:=y;
    if y<=x then siftup(h,i)
      else siftdown(h,n,i);
end;

procedure heapdeletemax(var h:arr; var n,x:longint);
  begin
    x:=h[1];
    heapdelete(h,n,1);
end;

procedure makeheap(var h:arr;n:longint);
  var
    i:longint;
  begin
    for i:=n div 2 downto 1 do
      siftdown(h,n,i);
end;

procedure heapsort(var h:arr;n:longint);
  var
    j,t:longint;
  begin
    for j:=n downto 2 do
      begin
        t:=h[1];
        h[1]:=h[j];
        h[j]:=t;
        siftdown(h,j-1,1);
        write(h[j],' ');
      end;
    write(h[1]);
end;

procedure heapinput;
  var
    i:longint;
  begin
    readln(n);
    for i:=1 to n do
      read(h[i]);
end;

procedure heapprint(h:arr;n:longint);
  var
    i:longint;
  begin
    writeln;
    for i:=1 to n do
      write(h[i],' ');
end;

begin
  heapinput;
  makeheap(h,n);
  heapprint(h,n);
  readln(p);
  case p of
    1:begin
        writeln('delete i');
        readln(q);
        heapdelete(h,n,q);
        heapprint(h,n);
      end;
    2:begin
        writeln('return max');
        heapdeletemax(h,n,x);
        writeln(x);
        heapprint(h,n);
      end;
    3:begin
        writeln('insert x');
        readln(x);
        heapinsert(h,n,x);
        heapprint(h,n);
      end;
    4:begin
        writeln('heap sort');
        heapsort(h,n);
      end;
  end;
end.


版权属于: Chris

原文地址: http://blog.sina.com.cn/s/blog_83ac6af80102v0n1.html

转载时必须以链接形式注明原始出处及本声明。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值