Производительность
November 18, 2022
Классические сортировки и их производительность
Наиболее известные простые алгоритмы сортировок - это сортировка выбором, пузырьковая сортировка и сортировка вставками. Сравним их производительность.
Код сортировки выбором
procedure SortByChoice(a: array of integer);
begin
for var i := 0 to a.Length-2 do
begin
var min := a[i];
var imin := i;
for var j := i + 1 to a.Length-1 do
if a[j] < min then
begin
min := a[j];
imin := j;
end;
Swap(a[imin],a[i]);
end;
end;Код пузырьковой сортировки
procedure BubbleSort(a: array of integer);
begin
for var i := 1 to a.Length-1 do
for var j := a.Length-1 downto i do
if a[j] < a[j-1] then
Swap(a[j], a[j-1]);
end;Код сортировки вставками
procedure SortByInsert(a: array of integer);
begin
for var i:=1 to a.Length-1 do
begin
var x := a[i];
var j := i - 1;
while (j >= 0) and (x < a[j]) do
begin
a[j+1] := a[j];
j -= 1;
end;
a[j+1] := x;
end;
end;Основная программа для определения производительности
uses Utils; // процедуры сортировок begin var n := 50000; var a := ArrRandomInteger(n,0,integer.MaxValue-1); var b := Copy(a); Benchmark(procedure -> SortByChoice(b),1).Println; b := Copy(a); Benchmark(procedure -> BubbleSort(b),1).Println; b := Copy(a); Benchmark(procedure -> SortByInsert(b),1).Println; b := Copy(a); Benchmark(procedure -> Sort(b),1).Println; end.
В конце - как мы видим - для сравнения - вызов процедуры Sort(a) из стандартной библиотеки
Результаты
Выводы. Сортировка выбором по сравнению с двумя другими сортировками - самая производительная. Пузырьковая сортировка в 5 раз более медленная. Однако все приведенные сортировки имеют квадратичную сложность и неэффективны на больших объёмах данных. Уже при n=50000 время вычислений измеряется секундами. Стандартная сортировка имеет сложность n*log(n) и существенно более производительная. При n=50000 она работает за миллисекунду.