СРАВНИТЕЛЬНЫЙ АНАЛИЗ ЗАТРАТ МАШИННОГО ВРЕМЕНИ НА РЕАЛИЗАЦИЮ АЛГОРИТМОВ СОРТИРОВКИ НА ЯЗЫКЕ ПРОГРАММИРОВАНИЯ «PYTHON»
Введение
Сортировка массивов данных является основой для решения множества прикладных задач, таких как определение рациональных режимов эксплуатации, получение достоверно-прогнозируемых оценок реального состояния и ряда других, в которых существует необходимость упорядочивания информации с целью ее дальнейшего анализа, обработки и пр. Известно, что задача сортировки массивов данных с математической точки зрения сводится к упорядочиванию данных согласно заданного критерия посредством сравнения, обмена и перестановки элементов массива посредством итерационных, гибридных и иных алгоритмов сортировки. При этом применимость известных методов сортировки в условиях ограниченности вычислительных ресурсов лимитируется рядом параметров, к основным из которых принято относить объем массива, стабильность и величину затрат машинного времени. Настоящая работа посвящена оценке стабильности и затрат машинного времени на сортировку массивов с количеством элементов от 100 до 10000 шт.
Цель исследования
Сравнительный анализ затрат машинного времени на реализацию, на языке программирования Python, наиболее распространенных алгоритмов сортировки массивов, таких как сортировка пузырьком, сортировка перемешиванием, сортировка вставками, сортировка слиянием и сортировка с помощью двоичного дерева.
Материал и методы исследования
В работе, при описании задачи сортировки массива из 1, 2 … п элементов, принимаем известную формулировку [1]: пусть требуется упорядочить массив элементов: R1,R2,…,Rn, в котором каждый элемент представляет собой запись Rj, содержащую некоторую информацию и ключ Kj, управляющий процессом сортировки. На множестве ключей определено отношение порядка «<» так, чтобы для любых трёх значений ключей a,b,c выполнялись следующие условия:
· закон трихотомии: либоa<b
, либоa>b
, либоa=b
;
· закон транзитивности: еслиa<b
иb<c
, тоa<c
.
В этом приближении задача сортировки сводится к нахождению такой перестановки записей p(1)p(2)…p(n), после которой ключи a,b,c расположились бы в порядке не убывания: Kp(1)⩽Kp(2)⩽⋯⩽Kp(n).
В работе рассмотрим наиболее популярные алгоритмы сортировки массивов [2], такие как сортировка пузырьком, сортировка перемешиванием, сортировка вставками, сортировка слиянием и сортировка с помощью двоичного дерева. [3] В сортировке пузырьком алгоритм состоит из проходов по массиву, сравнивая при этом последовательные пары элементов и меняя их местами, если они расположены в неправильном порядке. Сортировка перемешиванием является разновидностью сортировки пузырьком, но при этом движение двунаправленное, то есть массив поочередно просматривается справа налево и слева направо, а границы части массива, где происходит движение, устанавливается в месте последнего обмена на каждой итерации. [3] В сортировке вставками элементы входной последовательности просматриваются по одному, и каждый следующий элемент размещается в подходящее место среди ранее упорядоченных элементов, начиная с нулевого. В сортировке слиянием происходит рекурсивное разделение массива на 2 части до тех пор, пока размер каждой части не будет равен 1, а затем на каждом шаге происходит сравнение двух элементов, меньший из которых записывается в массив, т.е. происходит склеивание двух отсортированных массивов. В методе сортировки с помощью двоичного дерева строится двоичное дерево поиска, главным свойством которого является то, что для каждого узла все элементы в левом поддереве меньше его значения, а в правом больше или равны. После построения дерева выполняется его обход – сначала левое поддерево, затем текущий узел и правое дерево. Во всех случаях, оценка затрат машинного времени производилась для [4] трех сценариев формирования массива данных.
Оценка достоверности полученных результатов затрат машинного времени на выполнение сортировки множества оценивалась путем сравнения с известными теоретическими зависимостями, а именно асимптотической нотацией O(n), O(n2) или O(n×log(n)) представляющей собой зависимость скорости выполнения программы от размера входного массива. Следует отметить, что асимптотическая нотация как математическая форма записи зависимости времени сортировки хоть и даёт более широкое представление о временных затратах на упорядочивание данных, но не даёт вещественных значений, в работе выполнена попытка получить среднестатистический результат затрат времени на различные типы сортировок, путём замера результатов запуска различных случаев начального массива и различных сортировок. Для измерения скорости работы алгоритмов сортировок выбран язык программирования Python, база готовых решений в области сортировки которого позволяет выполнить сортировку массивов данных всеми рассмотренными выше способами. Оценка затрат машинного времени на выполнения операции сортировки выполнялась с встроенным модулем [5] time языка программирования Python, позволяющим выполнить фиксацию значений времени до и после выполнения кода. Оценка погрешности затрат времени на реализацию алгоритмов сортировки массивов выполнялась посредством сортировки для каждого случая не менее чем 100 одинаковых массивов с последующим определением среднего значения времени выполнения операции сортировки и определения диапазон максимальных отклонений от него.
Результаты исследования и их обсуждение
Результаты оценки затрат машинного времени приведены в табл. 1. и на рис. 1-5. Из приведенных результатов видно, что результаты вычислительного эксперимента качественно
Таблица 1 – Затраты машинного времени на сортировку, с
|
Мас-сив |
Сортировка пузырьком |
Сортировка перемешиванием |
Сортировка вставками |
Сортировка слиянием |
Сортировка с помощью двоичного дерева |
||||||
|
n,шт |
Вар. |
Время, с |
Время, с |
Время, с |
Время, с |
Время, с |
|||||
|
Факт |
Ожи-дание |
Факт |
Ожи- дание |
Факт |
Ожи- дание |
Факт |
Ожи-дание |
Факт |
Ожи-дание |
||
|
100 |
I |
(4.47±0.48)×10-4 |
O(n2) |
(3.89±037)×10-4 |
O(n2) |
(2.11±0.11×10-4 |
O(n2) |
(1.66±0.22)×10-4 |
O(n) |
(1.33±0.17)×10-4 |
O(n2) |
|
II |
(1.05±0.40)×10-5 |
(1.14±0.18)×10-5 |
(1.29±0.17)×10-5 |
(1.16±0.07)×10-4 |
(5.59±0.20)×10-4 |
O(nlogn) |
|||||
|
III |
(5.18±1.12)×10-6 |
O(n) |
(5.01±1.01)×10-6 |
O(n) |
(1.01±0.18)×10-5 |
O(n) |
(1.42±0.14)×10-4 |
(1.12±0.07)×10-4 |
O(n2) |
||
|
1000 |
I |
(3.73±0.04)×10-2 |
O(n2) |
(3.36±0.02)×10-2 |
O(n2) |
(1.85±0.01)×10-2 |
O(n2) |
(2.33±0.16)×10-3 |
O(n) |
(1.02±0.08)×10-3 |
O(n2) |
|
II |
(1.08±0.10)×10-3 |
(7.83±0.48)×10-4 |
(5.74±0.21)×10-4 |
(1.86±0.11)×10-3 |
(6.71±0.26)×10-2 |
O(nlogn) |
|||||
|
III |
(5.52±1.22)×10-5 |
O(n) |
(5.78±0.26)×10-5 |
O(n) |
(1.10±0.11)×10-4 |
O(n) |
(2.10±012)×10-3 |
(1.45±0.06)×10-3 |
O(n2) |
||
|
5000 |
I |
1.03±0.01 |
O(n2) |
0.85±0.01 |
O(n2) |
0.48±0.01 |
O(n2) |
(1.19±0.04)×10-2 |
O(n) |
(3.81±0.18)×10-3 |
O(n2) |
|
II |
(1.41±0.03)×10-2 |
(1.48±0.03)×10-2 |
(1.01±0.01)×10-2 |
(1.08±0.07)×10-2 |
1.72±0.01 |
O(nlogn) |
|||||
|
III |
(3.33±0.37)×10-4 |
O(n) |
(3.14±0.27)×10-4 |
O(n) |
(6.41±0.65)×10-4 |
O(n) |
(1.05±0.02)×10-2 |
(7.65±0.58)×10-3 |
O(n2) |
||
|
8000 |
I |
2.65±0.02 |
O(n2) |
2.20±0.03 |
O(n2) |
1.22±0.01 |
O(n2) |
(1.91±0.02)×10-2 |
O(n) |
(5.64±0.03)×10-3 |
O(n2) |
|
II |
(3.61±0.02)×10-2 |
(3.63±0.08)×10-2 |
(2.54±0.01)×10-2 |
(1.71±0.02)×10-2 |
4.48±0.14 |
O(nlogn) |
|||||
|
III |
(5.60±0.39)×10-4 |
O(n) |
(5.17±0.29)×10-4 |
O(n) |
(9.97±0.69)×10-4 |
O(n) |
(1.71±0.03)×10-2 |
(1.27±0.03)×10-2 |
O(n2) |
||
|
10000 |
I |
4.05±0.02 |
O(n2) |
3.68±0.10 |
O(n2) |
1.89±0.03 |
O(n2) |
(2.44±0.04)×10-2 |
O(n) |
(7.32±0.11)×10-3 |
O(n2) |
|
II |
(5.64±0.01)×10-2 |
(5.64±0.02)×10-2 |
(3.93±0.03)×10-2 |
(2.17±0.06)×10-2 |
6.86±0.11 |
O(nlogn) |
|||||
|
III |
(7.07±0.64)×10-4 |
O(n) |
(6.69±0.69)×10-4 |
O(n) |
(1.28±0.11) ×10-3 |
O(n) |
(2.18±0.05)×10-2 |
(1.62±0.08)×10-2 |
O(n2) |
||

а

б

в
Рисунок 1 –Сортировка пузырьком:
а – в I массиве; б – в II массиве; в - в III массиве.

а

б

в
Рисунок 2 –Сортировка перемешиванием: а – в I массиве; б – в II массиве; в - в III массиве.

а

б

в
Рисунок 3 –Сортировка вставками: а – в I массиве; б – в II массиве; в - в III массиве.

а

б

в
Рисунок 4 –Сортировка слиянием: а – в I массиве; б – в II массиве; в - в III массиве.

а

б

в
Рисунок 5 –Сортировка двоичным деревом: а – в I массиве; б – в II массиве; в - в III массиве.
и количественно совпадают с теоретическим ожиданием, что подтверждает корректность сделанных приближений и достоверность результатов оценки затрат машинного времени.
Вывод
В работе, на ноутбуке с высокопроизводительным мобильным процессором AMD Ryzen 7 линейки Hawk Point c тактовой частотой 3.8 ГГц., выполнен сравнительный анализ затрат машинного времени на реализацию, на языке программирования Python, наиболее распространенных алгоритмов сортировки массивов. Показано, что для массивов с худшим сценарием расположения элементов затраты машинного времени возрастают от 4,47×10-4 с. до 4,05 с., и для лучшего сценария возрастают от 5,19×10-6 с. … 7,07×10-4 с. Затраты машинного времени для сортировки перемешиванием составляют 3,89×10-4 с. … до 3,68 с. и 5,01×10-6 с. … 6,69×10-4 с., для сортировки вставками 2,11×10-4 с. … до 1,90 с. и 1,01×10-5 с. … 1,28×10-3 с., для сортировки слиянием от 1,66×10-4 с. … 2,44×10-2 с. и 1,42×10-4 с. … 2,18×10-2 с. , для сортировки с помощью двоичного кода 5,59×10-4 с. … 6,86 с. и 1,12×10-4 с. … 1,62×10-2 с. соответственно. Оценка эффективности работы алгоритмов по реализации методов сортировок показала, что в случайном массиве быстрее всего является сортировка двоичным деревом, а самой медленной оказалась сортировка пузырьком.
Конфликт интересов
Финансирование
Библиографическая ссылка
URL: https://www.eduherald.ru/article/view?id=22183 (дата обращения: 25.08.2026).
DOI: https://doi.org/10.17513/msnv.22183
