Пирамидальная сортировка

Алгоритм пирамидальной сортировки (heapsort) — один из самых быстрых алгоритмов сортировки.


Program heapsort;   
   
{$APPTYPE CONSOLE}   
   
type   
  tkey = integer;   
  int = integer;   
   
const N = 10;     
   
var a,b : array [0..N+1] of tkey;   
   
function parent(x : int) : int;   
begin   
  result:=x shr 1;   
end;   
   
function left(x : int) : int;   
begin   
  result := x shl 1;   
  if result > a[0] then result := N+1;   
end;   
   
function right(x:int):int;   
begin   
  result := x shl 1 + 1;   
  if result > a[0] then result := N+1;   
end;   
   
procedure swap(i,j : int);   
var temp : tkey;   
begin   
  temp := a[i];   
  a[i] := a[j];   
  a[j] := temp;   
end;   
   
procedure moveup(x : int);   
begin   
  while (a[x] > a[parent(x)]) and (parent(x) > 0)  do begin   
    swap(x, parent(x));   
    x := parent(x);   
  end;   
end;   
   
procedure movedown(x : int);   
var max : integer;   
begin   
  if a[left(x)] > a[right(x)] then max := left(x)   
  else max := right(x);   
  while (a[max] > a[x]) and (max <= a[0]) do begin   
    swap(max, x);   
    x := max;   
    if a[left(x)] > a[right(x)] then max := left(x)   
    else max := right(x);   
  end;   
end;   
   
   
procedure update(x : int; k : tkey);   
begin   
  a[x] := k;   
  moveup(x);   
  movedown(x);   
end;   
   
procedure add(k : tkey);   
begin   
  inc(a[0]);   
  update(a[0], k);   
end;   
   
procedure delete(x : int);   
begin   
  swap(x, a[0]);   
  dec(a[0]);   
  update(x, a[x]);   
end;   
   
procedure hsort;   
var i:int;   
begin   
  a[0] := 1;   
  a[1] := b[1];   
  for i := 2 to N do   
    add(b[i]);   
  for i := 1 to N do   
    delete(1);   
end;   
   
var i : int;   
   
begin   
  randomize;   
  fillchar(a, sizeof(a), 0);   
  fillchar(b, sizeof(b), 0);     
   
  for i := 1 to N do   
    b[i] := random(10);   
   
  writeln('Non-sorted elements');   
  for i := 1 to N do   
    write(b[i], ' ');   
  writeln;   
   
  hsort;   
   
  writeln('Sorted elements');   
  for i := 1 to N do   
    write(a[i], ' ');   
  readln;   
end.  
Теги:
Пирамидальная сортировка
Добавлено: 01 Августа 2018 08:30:21 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...