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

Формулировка задачи:

Нужна помощь, тема сложная улучшенные методы сортировки, метод пирамидальной сортировки, есть программа со всем необходимым, но не хватает процедуры сортировки. Условие такое: Дан одномерный массив, первую его половину элементов отсортировать по возрастанию, а вторую по убыванию. Добавить счётчик итераций(по возможности). По возрастанию есть небольшой кусок кода(просто как пример), но его нужно как-то адаптировать к программе(к моему условию) и плюс ещё добавить сортировку второй части по убыванию
Uses Crt;
Const       N = 50;
Type        T_Mas = Array [1..N] of Integer;
Var     Mas : T_Mas;
        Kol : Integer;          
Procedure Count (Var Kol:Integer);
{Процедура определения размерности массива}
Var     IOR : Word;
Begin
Write('Введите размерность массива: ');
    Repeat
        {$I-} ReadLn(Kol); {$I+}
        IOR := IOResult;
        If odd(IOR) or (Kol>N) Then
            WriteLn('Ошибка. Повторите ввод.')
    Until (Kol<=N) and (IOR=0)
End;
Procedure Filling (Kol:Integer; Var A: T_Mas);
{Процедура заполнения массива}
Var I : Integer;
Begin
    Randomize;
    For I := 1 To Kol Do A[I] := Random(N)
End;
Procedure Print (Kol:Integer; A: T_Mas);
{Процедура вывода массива}
Var I : Integer;
Begin
    For I:=1 to Kol do Write (A[I], ' ')
End;
{.......................пирамидальная сортировка........................}
procedure heapsort(var A: T_mas);
var L, R: integer;
x: integer;
procedure sift (L, R: integer);
var i, j: integer; x: integer;
begin i:=L; j:=2*L; x:=a[L];
if (j<R) and (a[j] < a[j+1]) then j:=j+1;
while (j <= R) and (x < a[j]) do begin
a[i]:=a[j]; i:=j; j:=2*j;
if (j < R) and (a[j] < a[j+1]) then j:=j+1;
end;
a[i]:=x
end;
begin
L:=(n Div 2)+1; R:=n;
while L > 1 do begin L:=L-1; sift(L, R) end;
while R > 1 do begin 
x:= a[1]; a[1]:= a[R]; a[R]:=x; R:=R-1; sift(L, R)
end;
end;
{.........................................................................................}
Begin
    ClrScr;
    Count(Kol);
    Filling(Kol, Mas);
    WriteLn('Исходный массив'); Print (Kol, Mas);
    {................процедура пирамидальной сортировки..........}
    WriteLn;
    WriteLn('Отсортированный массив'); Print (Kol, Mas);
    Repeat until KeyPressed
End.

Код к задаче: «Пирамидальная сортировка - Turbo Pascal»

textual
Uses Crt;
Const       N = 50;
Type        T_Mas = Array [0..N] of Integer;
Var     Mas : T_Mas;
        Kol : Integer;
Procedure Count (Var Kol:Integer);
{Процедура определения размерности массива}
Var     IOR : Word;
Begin
Write('Введите размерность массива: ');
Repeat
{$I-} ReadLn(Kol); {$I+}
IOR := IOResult;
If odd(IOR) or not(Kol in [1..N]) Then  WriteLn('Ошибка. Повторите ввод.')
Until (Kol<=N) and (IOR=0)
End;
Procedure Filling (Kol:Integer; Var A: T_Mas);
{Процедура заполнения массива}
Var I : Integer;
Begin
Randomize;
For I := 1 To Kol Do A[I] := Random(N)
End;
Procedure Print (Kol:Integer; A: T_Mas);
{Процедура вывода массива}
Var I : Integer;
Begin
    For I:=1 to Kol do Write (A[I], ' ')
End;
{.......................пирамидальная сортировка........................}
procedure Sort(Kol: integer; var A: T_mas);
procedure Sort_1(var A: T_Mas; Count: Integer);
  procedure DownHeap(index, Count: integer; Current: integer);
  {Функция пробегает по пирамиде восстанавливая ее
  Также используется для изначального создания пирамиды
  Использование: Передать номер следующего элемента в index
  Процедура пробежит по всем потомкам и найдет нужное место для следующего элемента}
  var
    Child, k: Integer;
  begin
k:= Kol div 2;
for i:=1 to k-1 do
  begin
    while index < Count div 2 do
     begin
      Child := (index+1)*2-1;
      if (Child < Count-1) and (A[Child] < A[Child+1]) then
        Child:=Child+1;
      if Current >= A[Child] then
        break;
      A[index] := A[Child];
      index := Child;
    end;
    A[index] := Current;
  end;
 
procedure Sort_2(var A: T_Mas; Count: Integer);
  procedure DownHeap(index, Count: integer; Current: integer);
  {Функция пробегает по пирамиде восстанавливая ее
  Также используется для изначального создания пирамиды
  Использование: Передать номер следующего элемента в index
  Процедура пробежит по всем потомкам и найдет нужное место для следующего элемента}
  var
    Child, k: Integer;
  begin
k:= Kol div 2;
for i:=1 to k-1 do
  begin
    while index > Count div 2 do
     begin
      Child := (index+1)*2-1;
      if (Child > Count-1) and (A[Child] > A[Child+1]) then
        Child:=Child+1;
      if Current <= A[Child] then
        break;
      A[index] := A[Child];
      index := Child;
    end;
    A[index] := Current;
  end;
 
 
{Основная функция }
var
  i: integer;
  Current: integer;
begin
  {Собираем пирамиду}
  for i := (Count div 2)-1 downto 0 do
    DownHeap(i, Count, A[i]);
  {Пирамида собрана. Теперь сортируем}
  for i := Count downto 0 do begin
    Current := A[i];{перемещаем верхушку в начало отсортированного списка}
    A[i] := A[0];
    DownHeap(0, i, Current);{находим нужное место в пирамиде для нового элемента}
  end;
end;
{......................................................................}
Begin
ClrScr;
Count(Kol);
Filling(Kol, Mas);
WriteLn('Исходный массив');
Print (Kol, Mas);
 {................процедура пирамидальной сортировки..........}
sort(Mas,Kol);
WriteLn;
WriteLn('Отсортированный массив');
Print (Kol, Mas);
Repeat until KeyPressed
End.
Эта работа вам не подошла?

Вы всегда можете заказать любую учебную работу у наших авторов от 20 руб.

9   голосов, оценка 4.222 из 5


СДЕЛАЙТЕ РЕПОСТ