В этой статье речь пойдёт о бенчмарке алгоритмов сортировки, написанном на PHP.
Всего представлено 14 алгоритмов:
Алгоритмы расположены не в алфавитном порядке, а в порядке уменьшения их быстродействия при сортировке массива в 8 тыс. элементов.
Представленные размерности массивов, использующиеся при сортировки:
Также каждый замер был произведён с различным наполнением массива, передающегося в функцию сортировки:
Каждый замер был сделан по три раза и взято среднее арифметическое.
В этой категории участвуют все функции сортировки.
![](https://habrastorage.org/r/w1560/getpro/habr/post_images/b58/0e7/cc0/b580e7cc0b58bc9063f711a3fb18cfc9.png)
![](https://habrastorage.org/r/w1560/getpro/habr/post_images/42e/dd1/237/42edd1237edd6ede13056516b4a7120f.png)
В этот раз участвуют 5 самых быстрых алгоритма: сортировка подсчётом, быстрая сортировка, сортировка расчёской, сортировка кучей и сортировка слиянием.
![](https://habrastorage.org/r/w1560/getpro/habr/post_images/880/9c5/aa3/8809c5aa36c947c4577bdecab71491cb.png)
![](https://habrastorage.org/r/w1560/getpro/habr/post_images/bd3/a03/233/bd3a032338b26c373b49bf0b201e6feb.png)
В этот раз участвуют все те же 5 алгоритмов: сортировка подсчётом, быстрая сортировка, сортировка расчёской, сортировка кучей и сортировка слиянием.
![](https://habrastorage.org/r/w1560/getpro/habr/post_images/ebf/8d4/136/ebf8d41365cf5243af94b3b80468659f.png)
![](https://habrastorage.org/r/w1560/getpro/habr/post_images/074/945/264/074945264712035cfcf63ef0a45353c8.png)
В последнем забеге на 2 миллиона элементов приняли участие два алгоритма: сортировка подсчётом и быстрая сортировка.
![](https://habrastorage.org/r/w1560/getpro/habr/post_images/28c/4df/7b3/28c4df7b32b0f06e04e0ebaba2ae37c2.png)
![](https://habrastorage.org/r/w1560/getpro/habr/post_images/3a9/882/3dd/3a98823dd01104cf557c8cf57682f1f1.png)
QuickSort по праву считается достаточно хорошим алгоритмом. CountingSort очень хорош на небольших диапазонах значений, иначе не справляется из-за нехватки памяти. Шейкерная сортировка оказалась неудачным выбором для случайных значений. «Пузырьковая» и её модификации не применимы для практического использования.
Исходный код всех алгоритмов + мои результаты: drive.google.com/file/d/0B5FrhsQAeZwCUmx0dzFjeVdra0E/edit?usp=sharing
Всего представлено 14 алгоритмов:
- quickSort
- countingSort
- combSort
- heapSort
- mergeSort
- shellSort
- selectionSort
- insertSort
- gnomeSort
- combinedBubbleSort
- cocktailSort
- bubbleSort
- oddEvenSort
- bubbleSortWithFlag
Подробнее об алгоритмах
quickSort – Быстрая сортировка* |
countingSort – Сортировка подсчетом* |
combSort – Сортировка расчёской* |
heapSort – Сортировка кучей* |
mergeSort – Сортировка слиянием* |
shellSort – Сортировка Шелла* |
selectionSort – Сортировка выбором* |
insertSort – Сортировка вставками* |
gnomeSort – «Гномья» сортировка* |
combinedBubbleSort – Модифицированная «Пузырьковая» сортировка |
cocktailSort – «Шейкерная» сортировка* |
bubbleSort – «Пузырьковая» сортировка* |
oddEvenSort – Сортировка чёт-нечет |
bubbleSortWithFlag – «Пузырьковая» сортировка с флагом перестановок |
Алгоритмы расположены не в алфавитном порядке, а в порядке уменьшения их быстродействия при сортировке массива в 8 тыс. элементов.
Представленные размерности массивов, использующиеся при сортировки:
- 1
- 100
- 200
- 400
- 600
- 800
- 1000
- 5000
- 10000
- 15000
- 20000
- 25000
- 30000
Также каждый замер был произведён с различным наполнением массива, передающегося в функцию сортировки:
- В первом случае массив заполнялся случайными значениями из промежутка (1, n), где n — размерность массива.
- Во втором случае массив заполнялся случайными значениями из промежутка (1, PHP_INT_MAX), где PHP_INT_MAX — максимальное значения переменной типа INT в текущей системе. На моей системе это значение 263, то есть около 9.2233720368548E+18
Каждый замер был сделан по три раза и взято среднее арифметическое.
Массивы размерностю до тысячи элементов
В этой категории участвуют все функции сортировки.
![](https://habrastorage.org/getpro/habr/post_images/b58/0e7/cc0/b580e7cc0b58bc9063f711a3fb18cfc9.png)
![](https://habrastorage.org/getpro/habr/post_images/42e/dd1/237/42edd1237edd6ede13056516b4a7120f.png)
Массивы размерностью до 30 тысяч элементов
В этот раз участвуют 5 самых быстрых алгоритма: сортировка подсчётом, быстрая сортировка, сортировка расчёской, сортировка кучей и сортировка слиянием.
![](https://habrastorage.org/getpro/habr/post_images/880/9c5/aa3/8809c5aa36c947c4577bdecab71491cb.png)
![](https://habrastorage.org/getpro/habr/post_images/bd3/a03/233/bd3a032338b26c373b49bf0b201e6feb.png)
Массивы размерностью до 200 тысяч элементов
В этот раз участвуют все те же 5 алгоритмов: сортировка подсчётом, быстрая сортировка, сортировка расчёской, сортировка кучей и сортировка слиянием.
![](https://habrastorage.org/getpro/habr/post_images/ebf/8d4/136/ebf8d41365cf5243af94b3b80468659f.png)
![](https://habrastorage.org/getpro/habr/post_images/074/945/264/074945264712035cfcf63ef0a45353c8.png)
Массивы размерностью до 2.000.000 элементов
В последнем забеге на 2 миллиона элементов приняли участие два алгоритма: сортировка подсчётом и быстрая сортировка.
![](https://habrastorage.org/getpro/habr/post_images/28c/4df/7b3/28c4df7b32b0f06e04e0ebaba2ae37c2.png)
![](https://habrastorage.org/getpro/habr/post_images/3a9/882/3dd/3a98823dd01104cf557c8cf57682f1f1.png)
Выводы
QuickSort по праву считается достаточно хорошим алгоритмом. CountingSort очень хорош на небольших диапазонах значений, иначе не справляется из-за нехватки памяти. Шейкерная сортировка оказалась неудачным выбором для случайных значений. «Пузырьковая» и её модификации не применимы для практического использования.
Исходный код всех алгоритмов + мои результаты: drive.google.com/file/d/0B5FrhsQAeZwCUmx0dzFjeVdra0E/edit?usp=sharing