堆的各种操作

来源:互联网 发布:北京口腔医院知乎 编辑:程序博客网 时间:2024/04/29 07:10

注:a数组储存数据,本文以小头堆的写法为例

建堆

procedure makeheap;var  i:longint;begin  for i:=n(div 2)downto 1 do//div 2不会错,可要可不要   down(i);end;

下移

procedure down(i,n:longint);//i是要下移的节点编号,n是堆的范围var  t,i,j:longint;begin  j:=i;  i:=i*2;  if i>n then exit;  repeat    if (a[i]>a[i+1])and(i+1<=n) then inc(i);    if a[i]<a[j] then      begin        t:=a[i];a[i]:=a[j];a[j]:=t;      end      else break;  j:=i;  i:=i*2;  until i>n;end;

上移

procedure up(i,n:longint);//i是要下移的节点编号,n是堆的范围var  t,i,j:longint;begin  if i=1 then exit;  repeat    j:=i div 2;    if a[i]<a[j] then      begin        t:=a[i];a[i]:=a[j];a[j]:=t;      end      else break;    i:=j;  until i=1;end;
2 0
原创粉丝点击