- •Алгоритмы поиска и сортировки. Сортировки: выбором, обменом, вставкой. Анализ сложности алгоритмов на примере сортировок. Простой и бинарный поиск.
- •Оценка алгоритмов сортировки
- •Классификация алгоритмов сортировок
- •Сортировка выбором
- •Void selectSort(t* arr, int size)
- •Сортировка пузырьковым всплытием (обменом)
- •Void bubbleSort(t* arr, int size)
- •If(pr) break;
- •Шейкерная (перемешиванием) сортировка
- •Void ShakerSort(t* arr, int start, int n)
- •Int left, right, I;
- •Сортировка вставками
- •Void insertSort(t* a, int size)
- •// Поиск места элемента в готовой последовательности
- •Быстрая сортировка
- •Рассмотрим алгоритм подробнее.
- •Общий алгоритм
- •Void quickSortR(t* a, long n) {
- •Модификации кода и метода
- •Void qsortR(t *a, long size) {
- •InsertSort(a, size);
- •Итеративная QuickSort
- •Void qSortI(t a[], long size)
- •Сортировка слиянием
- •Void Merging_Sort (t *a, int n){
- •Сортировка методом Шелла
- •Void Shell_Sort (t *a, int n)
- •Алгоритмы поисков в массивах
- •Линейный поиск (поиск в лоб) в массивах
- •Двоичный поиск (дихотомия)
Сортировка методом Шелла
Сортировка Шелла была названа в честь ее изобретателя – Дональда Шелла, который опубликовал этот алгоритм в 1959 году.
Общая идея сортировки Шелла состоит в сравнении на начальных стадиях сортировки пар значений, расположенных достаточно далеко друг от друга в упорядочиваемом наборе данных.
Такая модификация метода сортировки позволяет быстро переставлять далекие неупорядоченные пары значений (сортировка таких пар обычно требует большого количества перестановок, если используется сравнение только соседних элементов).
Общая схема метода состоит в следующем.
Шаг 1. n элементов исходного массива разбивается на n/2 групп элементов, так, чтобы в группе было не более 2 элементов, в первой может быть 3. Элементы в группе располагаются на расстоянии n/2. Происходит упорядочивание элементов в n/2 группах пар элементов (ai,an/2+i) для 0<i<n/2.
Шаг 2. Упорядочиваются элементы в n/4 группах из четырех элементов (ai,an/4+i,an/2+i,a3n/4+i) для 0<i<n/4.
Шаг 3. Упорядочиваются элементы уже в n/8 группах из восьми элементов и т.д.
На последнем шаге упорядочиваются элементы сразу во всем массиве a0,a1,...,an-1. На каждом шаге для упорядочивания элементов в группах используется метод сортировки вставками.
Рис.- Демонстрация сортировки по неубыванию методом Шелла
//Описание функции сортировки Шелла
template<class T>
Void Shell_Sort (t *a, int n)
{
int h, i, j,k,m;
T tmp;
for (h = n/2 ; h > 0 ; h = h/2)
for (k = 0 ; k < h ; k++) //перебор номеров групп
for (i =k+h ; i <n ; i+ = h) //сортировка вставками
{ tmp=a[i]; m=i;
for (j =i-h ; j>k ; j- = h)
if (a[j]<=tmp]) break; //место найдено
else {a[m]=a[j]; m=j;}
a[m]=tmp;
}
}
Метод, предложенный Дональдом Л. Шеллом, является неустойчивой сортировкой по месту.
Эффективность метода Шелла объясняется тем, что сдвигаемые элементы быстро попадают на нужные места. Среднее время для сортировки Шелла равняется O(n1.25), для худшего случая оценкой является O(n1.5).
Алгоритмы поисков в массивах
Очень часто программисту приходится работать с массивами. Также часто приходится определять содержит ли массив значение, соответствующее какому-либо заданному ключу.
Этот процесс получил название поиска.
Существует несколько разновидностей поиска: одни менее эффективны, но просты в использовании, другие более эффективны, но и, соответственно, более сложны, третьи более подходят для какого-либо вида массива или случая.
Например, метод простого линейного поиска, который достаточно прост в использовании, но является неэффективным для больших и сортированных массивов.
Для этих целей подходит метод двоичного поиска.
Линейный поиск (поиск в лоб) в массивах
Линейный поиск в массивах, или как его ещё называют, поиск в ЛОБ эффективен в массивах, с небольшим количеством элементов, причём элементы в таких массивах никак не отсортированы и не упорядочены.
Алгоритм линейного поиска в массивах последовательно проверяет все элементы массива и сравнивает их с ключевым значением.
Таким образом, в среднем необходимо проверить половину значений в массиве, чтобы найти искомое значение.
Чтобы убедиться, в отсутствии искомого значения необходимо проверить все элементы массива.
На семинарах мы рассматривали алгоритм и программу, которая ищет минимальное (максимальное) значение в массиве.
Поиск в программе реализован согласно алгоритму линейного поиска в массиве.
