4. Реализация операции добавления элемента.
При выполнении операции добавления элемента со
значением 17, элемент должен поместиться на свободное место, т.е.
позицию с индексом Num+1. Однако эта позиция
может не соответствовать правильному положению элемента в куче, так
как над ним может находиться элемент, имеющий меньший приоритет.
Понятно, что в этом случае для вершины с индексом 5 нарушается
основное свойство кучи. Эта ситуация изображена на рис 6а.
Простейшим способом разрешения этой ситуации
является обмен элементов, на которых произошло нарушение основного
свойства. При этом элемент с большим приоритетом поднимается вверх,
а элемент с меньшим приоритетом занимает его место.
Легко видеть, что при таком обмене свойство для
вершин, стоящих ниже, не нарушается. Такое преобразование приводит к
новому полному бинарному дереву (рис 6б.), которое еще не
удовлетворяет основному свойству кучи (для вершины с индексом 2).
Поэтому применяем аналогичный обмен для вершины с индексом 5.
Результат этого преобразования изображен на рис 7. В
результате получено полное бинарное дерево, которое удовлетворяет
основному свойству кучи. Поэтому, процедура добавления элемента
завершена.
S[0]: = 0;
for i:= 1 to N do {1. 1}
S[i]: = S[i - 1] + a[i];
Type Queue=array[1.. maxqueue] of real;
procedure insert(x:integer;
var H: array [0..n] of integer;
var Num:integer;
var code:integer;);
var i;
begin
if Num=n
then
code:=1
else
begin
Num:=Num+1;
i:=Num;
H[0]:=x; {барьер}
while (x < H[i div 2]) do
begin
H[i]:=H[i div 2];
i:=i div 2;
end; {while}
H[i]:=x;
code:=0;
end; {if}
end; {insert}
function delete_min(var H: array [0..n] of integer;
var Num:integer;
var code:integer):integer;
var i,child:integer;
last_el:element;
stop:boolean;
begin
if Num=0
then
code:=2
else
begin
delete_min:=H[1];
last_el:=H[Num];
Num:=Num-1;
i:=1; stop:=False;
while (2*i<=Num) and (not stop) do
begin
child:=2*i;
if child < Num then
if H[child+1] < H[child]
then child:=child+1;
if last_el > H[child] then
begin
H[i]:=H[child];
i:=child;
end
else
stop:=True;
end; {while}
H[i]:=last_el;
code:=0;
end; {if}
end; {delete_min}
Трудоемкость операции добавления определяется
количеством выполнения цикла while и не превышает
количества уровней кучи, которое равно Log2
(Num).
Назад