Delphi-int.ru: портал программистов

Вход Регистрация | Забыли пароль?

События

Сегодня:
Вопросы0    Ответы0    Мини-форумы0


Последние:
Вопрос09.08, 09:39 / #6696
Ответ29.03, 23:32 / #6682
Новости8 июля 2023


Сейчас онлайн:
На сайте — 11
На IRC-канале — 2

Ссылки

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

Алгоритм пирамидальной сортировки (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.

Автор: Дмитрий Ромодин

Статья добавлена: 21 января 2005

Следующая статья: Написание простого медиа-проигрывателя (часть 1) »

Рейтинг статьи: 5.00 Голосов: 1 Ваша оценка:

Зарегистрируйтесь/авторизируйтесь,
чтобы оценивать статьи.


Статьи, похожие по тематике

 

Для вставки ссылки на данную статью на другом сайте используйте следующий HTML-код:

Ссылка для форумов (BBCode):

Быстрая вставка ссылки на статью в сообщениях на сайте:
{{a:16}} (буква a — латинская) — только адрес статьи (URL);
{{статья:16}} — полноценная HTML-ссылка на статью (текст ссылки — название статьи).

Поделитесь ссылкой в социальных сетях:


Комментарии читателей к данной статье

Пока нет комментариев к данной статье. Оставьте свой и он будет первым.

Оставлять комментарии к статьям могут только зарегистрированные пользователи.