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

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

def ShellSort(list): distance = len(list) // 2 while distance > 0:

for i in range(distance, len(list)): temp = input_list[i]

j = i

# Сортировка подсписка для текущего значения дистанции

while j >= distance and list[j - distance] > temp: list[j] = list[j - distance]

j = j-distance list[j] = temp

# Уменьшаем расстояние до следующего элемента distance = distance//2

return list

Представленный выше код можно использовать для сортировки списка следу­ ющим образом (рис. 3.11).

Рис. 3.11

Обратите внимание, что вызов функции ShellSort привел к сортировке исход­ ного входного массива.

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

Сортировка Шелла не предназначена для больших данных. Она используется для наборов данных среднего размера. Грубо говоря, алгоритм даст достаточно хорошую производительность при работе со списком, содержащим до 6000 элементов. Если данные частично упорядочены, производительность будет выше. В идеале список полностью отсортирован, тогда для проверки порядка потребуется только один проход через N элементов, что обеспечит наилучшую производительность O(N).

Сортировка выбором

Как мы выяснили, сортировка пузырьком является одним из простейших алгоритмов сортировки. Сортировка выбором (selection sort) — это его улуч­

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

85

шенная версия. С ее помощью мы стараемся минимизировать общее количество обменов значений переменных. За каждый проход выполняется один обмен (сравните с N – 1 в случае сортировки пузырьком). Вместо того чтобы пере­ мещать наибольшее значение маленькими шагами, мы ищем его на каждой итерации и ставим в конец списка. Это значит, что в результате первого про­ хода наибольшее значение окажется справа, а в результате второго прохода к нему переместится следующее по величине значение. По мере выполнения алгоритма последующие элементы будут перемещаться в нужное место со­ гласно их значению. Последний элемент будет перемещен после (N – 1)-го прохода. Таким образом, сортировка выбором требует N – 1 проходов для сортировки N элементов (рис. 3.12).

1

70 – , • •

2

44 – , • •

3

34

– , • •

4

25

– • •• • •

5

19 – , • •

РЕЗУЛЬТАТ

Рис. 3.12

Реализация сортировки выбором на Python:

def SelectionSort(list):

for fill_slot in range(len(list) - 1, 0, -1): max_index = 0

for location in range(1, fill_slot + 1): if list[location] > list[max_index]:

max_index = location

list[fill_slot],list[max_index] = list[max_index],list[fill_slot]