Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций СиАОД.docx
Скачиваний:
17
Добавлен:
01.03.2025
Размер:
4.62 Mб
Скачать
  1. Сортировка

Алгоритм сортировки — это алгоритм для упорядочения элементов в списке. В случае, когда элемент списка имеет несколько полей, поле, служащее критерием порядка, называется ключом сортировки. На практике в качестве ключа часто выступает число, а в остальных полях хранятся какие-либо данные, никак не влияющие на работу алгоритма.

Дан массив A из n элементов:

,

Будем считать, что с каждым элементом   (помимо другой информации, не влияющей на сортировку) связан ключ  . На множестве ключей   задано отношение порядка — линейного (или совершенногоупорядочивания, для которого были бы выполнены следующие условия:

закон трихотомии: для любых   либо  , либо  , либо  ;

транзитивность: для любых   если   и  , то  .

Задачей сортировки по неубыванию является нахождение перестановки элементов   с индексами от  , при которой ключи располагаются в порядке неубывания:

[3]

В результате работы алгоритма и применения перестановки получается отсортированный массив:

Аналогично можно определить сортировку по невозрастанию.

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

На каждом шаге алгоритма мы выбираем один из элементов входных данных и вставляем его на нужную позицию в уже отсортированном списке, до тех пор, пока набор входных данных не будет исчерпан. Метод выбора очередного элемента из исходного массива произволен; может использоваться практически любой алгоритм выбора. Обычно (и с целью получения устойчивого алгоритма сортировки), элементы вставляются по порядку их появления во входном массиве. Приведенный ниже алгоритм использует именно эту стратегию выбора.

InsertionSort (list, N)

list - сортируемый список элементов

N - число элементов в списке

For i = 2 to N do

NewElement = list [i ]

location = i – 1

while ( location > = 1 ) and ( list [ location] > newElement ) do

// сдвигаем все элементы, большие очередного

list [ location + 1 ] = list [ location ]

location = location - 1

end while

list [ location + 1 ] = newElement

end for

Время выполнения алгоритма зависит от входных данных: чем большее множество нужно отсортировать, тем большее время выполняется сортировка. Также на время выполнения влияет исходная упорядоченность массива. Так, лучшим случаем является отсортированный массив, а худшим — массив, отсортированный в порядке, обратном нужному. Временная сложность алгоритма при худшем варианте входных данных — θ(n²).

    1. Корневая сортировка

При корневой сортировке упорядочивание списка происходит без непосредственного сравнения ключевых значений между собой. При этом создается набор «стопок», а элементы распределяются по стопкам в зависимости от значений ключей. Собрав значения обратно и повторив всю процедуру для последовательных частей ключа, мы получаем отсортированный список.

RadixSort (list, N)

List сортируемый список элементов

N число элементов в списке

Shift =1

For loop=1 to keySize do

For entry=1 to N do

bucketNumber=(list[entry].key/shift) mod 10

Append(bucket[bucketNumder],list[entry])

End for entry

List=CombineBuckets()

Shift=shift*10

End for loop

Функция CombineBuckets сводит все стопки от bucket[0] до bucket[9] в один список. Этот переформированный список служит основой для следующего прохода.

Пример

Исходный список

310, 213, 023, 130, 013, 301, 222, 032, 201, 111, 323, 002, 330, 102, 231, 120

Первый проход, разряд единиц

Номер стопки

Содержимое

0

310

130

330

120

1

301

201

111

231

2

222

032

002

102

3

213

023

013

323

Список, полученный в результате первого прохода

310, 130, 330, 120, 301, 201, 111, 231, 222, 032, 002, 102, 213, 023, 013, 323

Второй проход, разряд десятков

Номер стопки

Содержимое

0

301

201

002

102

1

310

111

213

013

2

120

222

023

323

3

130

330

231

032