Реализации алгоритмов/Сортировка/Пирамидальная: различия между версиями

Содержимое удалено Содержимое добавлено
м Добавлена ссылка на Википедию к Rust
Строка 449:
 
<source lang="pascal">
procedure SortHeapSort (var Arrsequence: array of SomeTypeT; Countcount: IntegerWord);
 
procedure DownHeapSiftDown (index, Countcount: integerWord; Currentcurrent: SomeTypeT);
{
Функция пробегает по пирамиде восстанавливая ее
Строка 458:
Процедура пробежит по всем потомкам и найдет нужное место для следующего элемента
}
var Childchild: IntegerWord;
begin
while index < Countcount div 2 do
begin
Childchild := (index + 1) * 2 - 1;
if (Childchild < Countcount - 1) and (Arrsequence[Childchild] < Arrsequence[Childchild + 1]) then
Childchild :=Child child + 1;
if Currentcurrent >= Arrsequence[Childchild] then
break;
Arrsequence[index] := Arrsequence[Childchild];
index := Childchild
end;
Arrsequence[index] := Currentcurrent
end;
 
{ Основная функция }
var i: integerInteger;
Currentcurrent: SomeTypeT;
begin
{ Собираем пирамиду }
for i := (Countcount div 2) - 1 downtodownTo 0 do
DownHeapSiftDown(i, Countcount, Arrsequence[i]);
{ Пирамида собрана. Теперь сортируем }
for i := Countcount - 1 downtodownTo 0 do
begin
Currentcurrent := Arrsequence[i]; { перемещаем верхушку в начало отсортированного списка }
Arrsequence[i] := Arrsequence[0];
DownHeapSiftDown(0, i, Currentcurrent) { находим нужное место в пирамиде для нового элемента }
end
end;
Строка 492 ⟶ 493 :
===Вариант № 2===
Примечание:
myarray = array[1..Size] of integer;
N — количество элементов массива
 
<source lang="pascal">
procedure HeapSort (var msequence: myarrayarray of T; N: integerInteger);
var i: integerInteger;
{ Выполняет обмен значениями двух элементов массива sequence с указанными индексами }
procedure Swap(var a,b:integer);
procedure SwapItems (index_1, index_2: Word);
var tmptemp: integerT;
begin
tmptemp := asequence[index_1];
asequence[index_1] := bsequence[index_2];
bsequence[index_2] := tmptemp
end;
 
procedure Sort (Ns: integer);
var i, tmpchild, pos, mid: integerInteger;
begin
mid := Ns div 2;
for i := mid downtodownTo 1 do
begin
pos := i;
while pos <= mid do
begin
tmpchild := pos * 2;
if tmpchild < Ns then
begin
if msequence[tmpchild + 1] <m sequence[tmpchild] then
tmpchild := tmpchild + 1;
if msequence[poschild]>m < sequence[tmppos] then
begin
SwapSwapItems(m[pos], m[tmp]child);
pos := tmpchild
end
else
pos := Ns
end
else if msequence[poschild]>m < sequence[tmppos] then
begin
SwapSwapItems(m[pos], m[tmp]child);
pos := Ns
end
Строка 542 ⟶ 543 :
begin
Sort(i);
SwapSwapItems(m[1], m[i])
end
end;
Строка 559 ⟶ 560 :
 
{ Процедура приведения массива к пирамидальному виду (to heap) }
procedure toHeapToHeap (var data: TArray; n: integer); { n - размер массива }
var i: integer;
begin
Строка 574 ⟶ 575 :
 
{ Процедура для сдвига массива влево }
procedure leftShiftLeft (var data: TArray; n: integer);
var i: integer;
temp: integer;
Строка 588 ⟶ 589 :
for i := n downTo 1 do
begin
toHeapToHeap(a, i);
leftShiftLeft(a, n);
end
END.