堆的操作

http://unbelievable.ycool.com/post.711038.html
经过06-08 的模式试题后....我对堆的感觉大大提高!!!

我把堆的基本操作都整理好...以备不时之需!!!!!(吸取教训!!!!)

以小根堆为例
上浮操作...
procedure up(var heap:node;k:longint);
var i,t:longint;
begin
 i:=k;
 while (i>1) and (heap[I]<heap[i div 2]) do begin
   t:=heap[I]; heap[I]:=heap[i div 2]; heap[i div 2]:=t;
   i:=i div 2;
 end;
end;


下沉操作...
procedure down(var heap:node;k:longint);
var i,j,t:longint;
begin
 i:=k; j:=k*2;
 while j<=heap[0] do begin
   if (heap[j+1]<heap[j]) and (j+1<=heap[0]) then inc(j);
   if heap[j]<heap[I] then begin
     t:=heap[I]; heap[I]:=heap[j]; heap[j]:=t;
   end else break;
 end;
end;


插入一个元素....  //实质 把该元素放到堆的末尾....再上浮....
procedure insert(var heap:node; k:longint);  // K 为插入的元素
begin
 inc(heap[0]);
 heap[heap[0]]:=k;
 up;
end;


删除一个元素....  //实质 把堆末尾的元素代替此元素....再下沉.... (MS 没有这样简单...明天再问)
procedure delete(var heap:node; k:longint);  // K 为某个元素的位置
var i:longint;
begin
 heap[k]:=heap[heap[0]];
 dec(heap[0]);
 down;
end;
 
  
堆的建立.... // MS 就是不断往堆里加元素?!.....  没有这么简单吧....
procedure build;
var i:longint;
begin
 for i:=1 to n do // n 个元素  元素保存到A 数组里.....
   insert(heap,a[I]);
end;


堆的排序.... // MS 就是不断的把根保存起来再删掉?!......  
procedure heapsort;
var i:longint;
begin
 for i:=1 to n do begin  // 排好的元素存到 B 数组中.....
   b[I]:=heap[1];
   delete(heap,1);
 end;
end;

posted @ 2008-12-05 15:23  jesonpeng  阅读(192)  评论(0)    收藏  举报