Очередь с приоритетом



Очередь с приоритетом - структура данных, представляющая собой очередь, элементы которой распределены по приоритету.

Листинг Delphi

const HeapLength = 10000;
type HeapData = integer;
     Heap = object
       public
         A : array[1..HeapLength] of HeapData;
         size : integer;
       public
         constructor Create;
         function Parent(i : integer) : integer;
         function Left(i : integer) : integer;
         function Right(i : integer) : integer;
         procedure Heapify(i : integer);
         procedure Build(N : integer);
         procedure Sort(N : integer);
     end;

implementation
  
constructor Heap.Create;
  begin
    size := 0;
  end;

  function Heap.Parent(i : integer) : integer;
  begin
    Result := i shr 1;
  end;

  function Heap.Left(i : integer) : integer;
  begin
    Result := i shl 1;
  end;

  function Heap.Right(i : integer) : integer;
  begin
    Result := (i shl 1)+1;
  end;

  procedure Heap.Heapify(i : integer);
    var l, r, largest : integer;
        t : HeapData;
  begin
    l := Left(i);
    r := Right(i);
    if (L <= size) and (A[l] > A[i])
      then largest := l
      else largest := i;
    if (r <= size) and (A[r] > A[largest])
      then  largest := r;
    if largest <> i
      then begin
             t := A[i];
             A[i] := A[largest];
             A[largest] := t;
             Heapify(largest);
           end;
  end;

  procedure Heap.Build(N : integer);
    var i : integer;
  begin
    size := N;
    for i := N shr 1 downto 1
      do Heapify(i);
  end;

  procedure Heap.Sort(N : integer);
    var i : integer;
        t : HeapData;
  begin
    Build(N);
    for i := N downto 2
      do begin
           t := A[1];
           A[1] := A[i];
           A[i] := t;
           dec(size);
           Heapify(1);
         end;
  end;

09.12.2007, 18:01

По всем вопросам обращаться: rumterg@gmail.com