- •Структуры и алгоритмы обработки данных
- •230100.62 – Информатика и вычислительная техника
- •Стандартная постановка задачи
- •Пример постановки задачи
- •Пример постановки задачи в стандартной форме
- •Алгоритмы и их сложность
- •Основы анализа программ
- •Пример анализа алгоритмов
- •Выполнение операторов программы
- •Основы доказательства корректности
- •Динамическое программирование
- •Перемножение нескольких матриц
- •Когда применимо динамическое программирование
- •Наибольшая общая подпоследовательность
- •Жадные алгоритмы
- •Задача о выборе заявок
- •Абстрактные типы данных
- •Атд «Список»
- •Атд «Стек»
- •Атд «Очередь»
- •Множества
- •Хеширование
- •Словари, основанные на хеш-таблицах
- •Поиск слова в тексте
- •Сортировка
- •Сортировка вставками
- •Корневая сортировка
- •Пирамидальная сортировка
- •Переформирование пирамиды
- •Построение пирамиды
- •Сортировка слиянием
- •Управление с помощью таблиц
- •Способы представления графа
- •Матрица смежности
- •Матрица инцидентности
- •Список рёбер
- •Алгоритмы обхода графа
- •Поиск в ширину
- •Задача о кратчайшем пути
- •Алгоритм Дейкстры
- •Алгоритм Беллмана-Форда
- •Задача перекресток
- •Максимальный поток
- •Метод Форда-Фалкерсона
- •Минимальные покрывающие деревья
- •Алгоритм Крускала
- •Алгоритм Прима
- •Минимальные покрывающие деревья
- •Поиск в глубину
- •Топологическая сортировка
- •Деревья
Сортировка
Алгоритм сортировки — это алгоритм для упорядочения элементов в списке. В случае, когда элемент списка имеет несколько полей, поле, служащее критерием порядка, называется ключом сортировки. На практике в качестве ключа часто выступает число, а в остальных полях хранятся какие-либо данные, никак не влияющие на работу алгоритма.
Дан массив A из n элементов:
,
Будем считать,
что с каждым элементом
(помимо
другой информации, не влияющей на
сортировку) связан ключ
.
На множестве ключей
задано отношение
порядка — линейного (или совершенного) упорядочивания,
для которого были бы выполнены следующие
условия:
закон
трихотомии: для любых
либо
,
либо
,
либо
;
транзитивность:
для любых
если
и
,
то
.
Задачей
сортировки по неубыванию является
нахождение перестановки элементов
с
индексами от
,
при которой ключи располагаются в
порядке неубывания:
[3]
В результате работы алгоритма и применения перестановки получается отсортированный массив:
Аналогично можно определить сортировку по невозрастанию.
Сортировка вставками
На каждом шаге алгоритма мы выбираем один из элементов входных данных и вставляем его на нужную позицию в уже отсортированном списке, до тех пор, пока набор входных данных не будет исчерпан. Метод выбора очередного элемента из исходного массива произволен; может использоваться практически любой алгоритм выбора. Обычно (и с целью получения устойчивого алгоритма сортировки), элементы вставляются по порядку их появления во входном массиве. Приведенный ниже алгоритм использует именно эту стратегию выбора.
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²).
Корневая сортировка
При корневой сортировке упорядочивание списка происходит без непосредственного сравнения ключевых значений между собой. При этом создается набор «стопок», а элементы распределяются по стопкам в зависимости от значений ключей. Собрав значения обратно и повторив всю процедуру для последовательных частей ключа, мы получаем отсортированный список.
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 |
