Почему скорость сортировки данных упорядоченных по убыванию и возрастанию практически одинаковая?
Пытаюсь разобраться в пирамидальной сортировке. Почему данные расположенные в массиве по убыванию сортируются по возрастанию практически с такой же скоростью как и данные расположенные в массиве по возрастанию? При пирамидальной сортировке
Код программы: Код используемой пирамидальной сортировки (взял с методички у преподавателя)
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 шт):
Хм... Вот только что было
Сортировка кучей - не адаптивная (как и сортировка выбором, как и быстрая). Её скорость мало зависит от упорядоченности данных
При построении кучи - при придании массиву свойства двоичной кучи - выполняется упорядочение снизу вверх. Если массив уже имеет свойства кучи (заметьте, что при этом он не так упорядочен, как массив по возрастанию или убыванию), то обменов не будет, но на асимптотику это не влияет. Этот этап занимает время O(n), он быстрее второго.
На втором этапе на каждом шаге выполняется обмен максимума с вершины кучи с последним текущим индексом. После этого бывший последний опускается с вершины, пока можно - этих шагов будет в пределах количества уровней log(n).
Вот и получается время O(nlogn) в целом.