堆的操作
经过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; |

没有这么简单吧....
浙公网安备 33010602011771号