Почему скорость сортировки данных упорядоченных по убыванию и возрастанию практически одинаковая?

Пытаюсь разобраться в пирамидальной сортировке. Почему данные расположенные в массиве по убыванию сортируются по возрастанию практически с такой же скоростью как и данные расположенные в массиве по возрастанию? При пирамидальной сортировке

Код программы: Код используемой пирамидальной сортировки (взял с методички у преподавателя)

program s;
CONST N=1000000;
TYPE MAS = ARRAY[1..N] OF Real;
VAR A:MAS;
var i,j,first,last:integer;

procedure vvod(var A:MAS);
var M:integer;
begin
  writeln;
  write('Введи М: ');
  readln(M);
  for var i:=1 to N do
    A[i]:=Random(M);
end;

procedure vivod(var A:MAS);
begin
for var i:=1 to N do
  write(A[i]:5)
end;

procedure Heapsort (var A:MAS);
var k:integer;
x:real;
flag: boolean;
begin
  for var i:=(N div 2) downto 1 do
  begin
    j:=i;
    while j<=(N div 2) do
    begin
      k:=2*j;
      if (k+1<=N) and (A[k]<A[k+1]) then
        k:=k+1;
      if A[k]>A[j] then
      begin
        x:=A[j];
        A[j]:=A[k];
        A[k]:=x;
        j:=k;
      end
      else
        break;
    end;
  end;
  for var i:=N downto 2 do
  begin
    x:=A[1];
    A[1]:=A[i];
    A[i]:=x;
    j:=1;
    flag:=true;
    while (j<=((i-1) div 2)) and flag do
    begin
      k:=2*j;
      if (k+1<=i-1) and (A[k]<A[k+1]) then
        k:=k+1;
      if A[k]>A[j] then
      begin
        x:=A[j];
        A[j]:=A[k];
        A[k]:=x;
        j:=k;
      end
      else
        flag:=false
    end
  end;
end;

var stopw := new Stopwatch;
begin
  vvod(A);
  writeln('Исходный массив');
 // vivod(A);
  writeln();
  writeln;
  writeln('Сортировка методом пирамиды (случайное заполнение)');
  stopw.start;
  Heapsort(A);
  stopw.Stop;
  writeln(stopw.Elapsed.Ticks/10000:0:2);
  stopw.Reset;
  writeln;
  writeln('Отсортированный массив');
 // vivod(A);
 writeln;
  writeln;
  writeln('Сортировка методом пирамиды (заполнение по возрастанию)');
  stopw.start;
  Heapsort(A);
  stopw.Stop;
   writeln(stopw.Elapsed.Ticks/10000:0:2);
  stopw.Reset
end.
 

Ответы (1 шт):

Автор решения: MBo

Хм... Вот только что было

Сортировка кучей - не адаптивная (как и сортировка выбором, как и быстрая). Её скорость мало зависит от упорядоченности данных

При построении кучи - при придании массиву свойства двоичной кучи - выполняется упорядочение снизу вверх. Если массив уже имеет свойства кучи (заметьте, что при этом он не так упорядочен, как массив по возрастанию или убыванию), то обменов не будет, но на асимптотику это не влияет. Этот этап занимает время O(n), он быстрее второго.

На втором этапе на каждом шаге выполняется обмен максимума с вершины кучи с последним текущим индексом. После этого бывший последний опускается с вершины, пока можно - этих шагов будет в пределах количества уровней log(n).

Вот и получается время O(nlogn) в целом.

→ Ссылка