- •Алгоритмы и структуры данных
- •Лекция 1 Тема 1.1. Критерии оценки алгоритмов
- •1.1.1. Асимптотические характеристики
- •Временная оценка (оценка порядка)
- •Общий случай определения временной сложности
- •Тема 1.2. Классификация алгоритмов по степени сложности
- •Виды функций оценки сложности алгоритмов
- •Экспериментальный метод оценки трудоемкости (сложности) алгоритма
- •Оценка пространственной (емкостной) сложности
- •Линейные структуры данных
- •Иерархические структуры данных
- •Сетевые структуры данных
- •Табличные структуры данных
- •Представление данных в памяти эвм
- •Базовые алгоритмы обработки данных
- •Тема 2.2. Алгоритмы обработки данных линейной структуры
- •3. Алгоритмы сортировки
- •3.1. Основные определения и классы алгоритмов
- •Наиболее распространенные простые алгоритмы внутренней сортировки (массивов)
- •Сортировка вставками
- •Сортировка выбором
- •3.2.3. Сортировка обменом (Пузырьковая сортировка)
- •3.2.4.Сортировка Шейкером
- •Эффективные методы внутренней сортировки
- •Сортировка Шелла
- •3.3.2. Быстрая сортировка
- •3.4.3. Сортировка Боуза - Нельсона
Базовые алгоритмы обработки данных
Эти алгоритмы являются результатом исследований и разработок, проводившихся на протяжении десятков лет. Они продолжают играть важную роль в решении реальных задач. К базовым алгоритмам структурного программирования можно отнести следующие.
Алгоритмы поиска, предназначенные для поиска конкретных элементов в больших коллекциях (массивах). К ним относятся основные и расширенные методы с использованием деревьев и преобразований цифровых ключей, в том числе деревья цифрового поиска, сбалансированные деревья, а также методы для работы с очень большими файлами.
Алгоритмы обработки строк, которые включают в себя ряд методов обработки длинных последовательностей символов. Наиболее распространенными являются задачи поиска подстроки в строке.
Алгоритмы сортировки, предназначенные для упорядочения массивов и файлов. К ним относятся задачи упорядочения слов (списков, строк) по алфавиту, любых сложных типов по значениям ключей и т.д.
Алгоритмы на деревьях, которые используются при решении ряда важных задач. Одной из основных задач является поиск и сортировка на двоичных и В - деревьях. Эти структуры позволяют существенно упростить решение таких задач.
Тема 2.2. Алгоритмы обработки данных линейной структуры
3. Алгоритмы сортировки
3.1. Основные определения и классы алгоритмов
Сортировка — это упорядочение элементов в списке. В случае, когда элемент имеет несколько полей, поле, служащее критерием порядка, называется ключом сортировки. На практике в качестве ключа часто выступает число, а в остальных полях хранятся любые данные, не влияющие на работу алгоритма.
Мы рассмотрим наиболее распространенные алгоритмы сортировки для чисел, хотя они могут быть распространены на строки и списки элементов, о которых говорилось в общем определении.
Наиболее распространенные простые алгоритмы внутренней сортировки (массивов)
Для определенности будем считать, что эти алгоритмы применяются к массивам целочисленных ключей вида
a[0], a[1], a[2], … a[n-1].
Их можно разделить на три основные категории алгоритмов сортировки:
вставками;
выбором;
обменом
Шелла.
Сортировка вставками
Это достаточно простой, но эффективный в некоторых случаях метод. Вначале считается, что первый элемент находится на своем месте. Далее, начиная со второго, каждый элемент сравнивается со всеми, стоящими перед ним. Если они стоят неправильно (например, при сортировке по возрастанию следующий меньше предыдущего), то меняются местами. Таким образом, очередной элемент сравнивается и меняется местами не со всем массивом, а только до тех пор, пока в начале не найдется элемент, меньший его. Для частично отсортированных массивов такой метод является довольно эффективным.
Словесное описание алгоритма можно представить так.
Алгоритм простой сортировки вставками
Задать исходный массив А из n элементов.
Для i от 0 до n
Индекс элемента в конце массива j = i
Пока (j > 0) И (Аj-1 > Ai)
Сдвиг большего элемента, чтобы было место для вставки
Аj = Аj-1
j = j - 1
Вставка j - го элемента на его место
Аj = Ai
Вывести массив А.
Число сравнений и пересылок в худшем случае пропорционально n2, т.е. сложность алгоритма равна О(n2).
Время сортировки можно сократить, если учесть, что начальная часть массива (до индекса j) упорядочена. При этом точку вставки можно найти методом деления пополам диапазона индексов этой части (от 0 до j).
Алгоритм сортировки двоичными вставками
Задать исходный массив А из n элементов.
Для i от 0 до n
Вставляемый элемент х = Ai
Левая граница диапазона L = 0.
Правая граница диапазона R =i.
Пока (L<R)
Искомый индекс m = (L + R)/2
Если Am ≤ x
L = m + 1
Иначе
R = m.
Перепись элементов на одну позицию в конец массива (освобождение места для вставки)
Для j от i до R + 1 с шагом -1
Аj = Аj-1
Вставка последнего элемента
АR= x
Вывести массив А.
Число сравнений и пересылок рассмотренным методом в худшем случае пропорционально n*log(n), т.е. сложность алгоритма равна О(n*log(n)).
