Производительность
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 она работает за миллисекунду.