Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
40_алгоритмов_Python.pdf
Скачиваний:
8
Добавлен:
07.04.2024
Размер:
13.02 Mб
Скачать

Алгоритмы сортировки

75

АЛГОРИТМЫ СОРТИРОВКИ

Вэпоху больших данных необходимы современные алгоритмы, чтобы эффек­ тивно сортировать и быстро находить элементы в сложных структурах. Выбор стратегии сортировки и поиска зависит от размера и типа данных. Хотя конеч­ ный результат будет одинаковым для различных алгоритмов, для эффективно­ го решения реальной проблемы нужно подобрать наиболее подходящий вариант.

Вданной главе представлены следующие алгоритмы сортировки:

zz сортировка пузырьком (bubble sort); zz сортировка вставками (insertion sort); zz сортировка слиянием (merge sort); zz сортировка Шелла (Shell sort);

zz сортировка выбором (selection sort).

Обмен значений переменных в Python

При реализации алгоритмов сортировки и поиска мы сталкиваемся с необхо­ димостью обмена значений двух переменных между собой. В Python для этого есть простой способ:

var1 = 1 var2 = 2

var1,var2 = var2,var1

>>>print (var1,var2)

>>>2 1

Давайте посмотрим, как это работает (рис. 3.1).

Рис. 3.1

Данный способ обмена значений используется во всех алгоритмах сортировки и поиска, о которых мы поговорим в этой главе.

Начнем с рассмотрения алгоритма сортировки пузырьком.

76

Глава 3. Алгоритмы сортировки и поиска

Сортировка пузырьком

Сортировка пузырьком (bubble sort) — это самый простой и медленный алгоритм сортировки. Он спроектирован так, что наибольшее значение перемещается вправо по списку на каждой итерации цикла. При наихудшем сценарии произ­ водительность этого алгоритма равна O(n2), поэтому его следует использовать только для небольших наборов данных.

Логика сортировки пузырьком

В основе сортировки пузырьком лежит ряд итераций, называемых проходами (passes). Для списка размера N нужно совершить N — 1 проходов. Рассмотрим подробно первую итерацию: проход 1.

Цель первого прохода — вывести наибольшее значение в конец списка. По мере выполнения алгоритма оно будет постепенно перемещаться вправо по списку.

В процессе сортировки значения соседних элементов сравниваются между собой попарно. Если в паре большее значение находится слева, происходит переста­ новка (обмен). Это продолжается до тех пор, пока мы не дойдем до конца списка. Работа алгоритма показана на следующей схеме (рис. 3.2).

1

Обмен

Обмен

Обмен

Обмен Нет обмена Обмен

Сортировка пузырьком

Рис. 3.2

Алгоритмы сортировки

77

Теперь посмотрим, как сортировка пузырьком реализуется в Python:

#Pass 1 of Bubble Sort lastElementIndex = len(list)-1 print(0,list)

for idx in range(lastElementIndex):

if list[idx]>list[idx+1]: list[idx],list[idx+1]=list[idx+1],list[idx] print(idx+1,list)

Первый проход сортировки пузырьком на Python выглядит следующим образом (рис. 3.3).

Рис. 3.3

После первой итерации алгоритма наибольшее значение оказывается в конце списка. Затем начинается следующий проход. Его цель — переместить второе по величине значение на предпоследнюю позицию в списке. Для этого алгоритм снова сравнивает значения соседних элементов и меняет их местами, если нуж­ но. Последний элемент не затрагивается, поскольку уже был помещен в нужную позицию на первой итерации.

Проходы выполняются до тех пор, пока все элементы данных не будут рас­ положены в порядке возрастания. Чтобы полностью отсортировать список, алгоритму потребуется N – 1 проходов для списка размером N. Полная реали­ зация сортировки пузырьком на Python выглядит следующим образом (рис. 3.4).

Теперь рассмотрим производительность алгоритма BubbleSort.

78

Глава 3. Алгоритмы сортировки и поиска

 

 

 

 

Рис. 3.4

Анализ производительности сортировки пузырьком

Легко увидеть, что сортировка пузырьком включает в себя два уровня циклов:

zz Внешний цикл. Совокупность проходов. Например, первый проход — это первая итерация внешнего цикла.

zzВнутренний цикл. Оставшиеся элементы в списке сортируются до тех пор, пока наибольшее значение не окажется справа. На первом проходе будет N – 1 сравнений, на втором — N – 2. На каждом последующем проходе ко­ личество сравнений будет уменьшаться на единицу.

Из-за двух уровней цикличности наихудшая сложность алгоритма равна O(n2).

Сортировка вставками

Основная идея сортировки вставками заключается в том, что на каждой итера­ ции мы удаляем элемент из имеющейся у нас структуры данных, а затем встав­ ляем его в нужную позицию. Именно поэтому алгоритм называется сортировкой вставками (insertion sort). На первой итерации мы сортируем два элемента данных. Затем мы расширяем выборку: берем третий элемент и находим для него позицию согласно его значению. Алгоритм выполняется до тех пор, пока все элементы не будут перемещены в правильное положение. Данный процесс показан на следующей диаграмме (рис. 3.5).

Алгоритм сортировки вставками на Python выглядит так:

def InsertionSort(list):

for i in range(1, len(list)):

Алгоритмы сортировки

79

j = i-1

element_next = list[i]

while (list[j] > element_next) and (j >= 0): list[j+1] = list[j]

j=j-1

list[j+1] = element_next return list

Вставка 25 Вставка 26 Вставка 22 Вставка 24 Вставка 27 Вставка 23 Вставка 21

Сортировка вставками

Рис. 3.5

Обратите внимание, что в основном цикле мы проходим по всему списку. В каж­ дой итерации двумя соседними элементами являются list[j](текущий элемент) и list[i] (следующий элемент).

В выражениях list [j]>element_next>и j>=0 мы сравниваем текущий элемент со следующим.

Давайте используем этот код для сортировки массива (рис. 3.6).

Рис. 3.6

Рассмотрим производительность алгоритма сортировки вставками.