- •Алгоритмы поиска и сортировки. Сортировки: выбором, обменом, вставкой. Анализ сложности алгоритмов на примере сортировок. Простой и бинарный поиск.
- •Оценка алгоритмов сортировки
- •Классификация алгоритмов сортировок
- •Сортировка выбором
- •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)
- •Алгоритмы поисков в массивах
- •Линейный поиск (поиск в лоб) в массивах
- •Двоичный поиск (дихотомия)
Сортировка пузырьковым всплытием (обменом)
Идея метода: шаг сортировки состоит в проходе сверху вниз по массиву. По пути просматриваются пары соседних элементов. Если элементы некоторой пары находятся в неправильном порядке, то меняем их местами.
Метод иногда называют методом перестановки соседних элементов.
Сортируемый массив в процессе сортировки остается на одном и том же месте.
Минимальные элементы как бы всплывают к началу массива.
В случае сортированного массива производится однократная проверка сортированности (количество сравнений равно n-1), в этом основное достоинство метода.
В общем случае количество сравнений пропорционально (n2). На практике метод пузырька, даже с улучшениями, работает слишком медленно. А потому - почти не применяется.
//-----------------------------------------------------------------------------------------
template< class T >
Void bubbleSort(t* arr, int size)
{ T tmp;
int pr;
for(int i = 0; i < size - 1; ++i) // i - номер прохода
{ pr=1;
for(int j = size - 1; j >=i+1; --j) // внутренний цикл прохода
{
if (arr[j - 1] >arr[j])
{ pr=0;
tmp = arr[j - 1];
arr[j - 1] = arr[j];
arr[j] = tmp;
}
}
If(pr) break;
}
}
//-----------------------------------------------------------------------------------------------
Шейкерная (перемешиванием) сортировка
Рассматриваемый алгоритм имеет несколько непохожих друг на друга названий. Среди них: сортировка перемешиванием, двунаправленная пузырьковая сортировка, шейкерная сортировка, пульсирующая сортировка (ripple sort), трансфертная сортировка (shuttle sort).
Второй вариант (двунаправленная пузырьковая сортировка) наиболее точно описывает процесс работы алгоритма. Здесь, в его название, довольно-таки удачно включен термин «пузырьковая».
Это действительно альтернативная версия известного метода, модификации в котором заключаются, по большей части, в реализации, упомянутой в названии, двунаправленности: алгоритм перемещается, ни как в обменной (пузырьковой) сортировке – строго снизу вверх (слева направо), а сначала снизу вверх, потом сверху вниз.
Перестановка элементов в шейкерной сортировке выполняется аналогично той же в пузырьковой сортировке, т. е. два соседних элемента, при необходимости, меняются местами.
Пусть массив требуется упорядочить по возрастанию. Обозначим каждый пройденный путь от начала до конца последовательности через Wi, где i – номер пути; а обратный путь (от конца к началу) через -Wj, где j – номер пути.
Тогда, после выполнения Wi, один из неустановленных элементов будет помещен в позицию справа, как наибольший элемент из еще неотсортированных элементов. А после выполнения -Wj, наименьший из неотсортированных, переместиться в некоторую позицию слева.
Так, например, после выполнения W1 в конце массива окажется элемент, имеющий наибольшее значение, а после -W1 в начало отправиться элемент с наименьшим значением.
Код программы на C++:
template< class T >
