Алгоритм быстрой сортировки.pptx
- Количество слайдов: 9
Алгоритм быстрой сортировки Выполнил студент ОНФ Группы ПМИ 138 Султанов Т. Д.
Цель работы : изучить алгоритм быстрой сортировки и его реализацию на языке С++ v Быстрая сортировка (англ. quicksort), часто называемая qsort по имени реализации в стандартной библиотеке языка Си—широко известный алгоритм сортировки, разработанный английским информатиком Чарльзом Хоаром в 1960 году. Один из быстрых известных универсальных алгоритмов сортировки массивов (в среднем O(n log n) обменов при упорядочении n элементов), хотя и имеющий ряд недостатков. v Quick. Sort является существенно улучшенным вариантом алгоритма сортировки с помощью прямого обмена (его варианты известны как «Пузырьковая сортировка» и «Шейкерная сортировка» ), известного, в том числе, своей низкой эффективностью. Принципиальное отличие состоит в том, что после каждого прохода элементы делятся на две независимые группы. Любопытный факт: улучшение самого неэффективного прямого метода сортировки дало в результате эффективный улучшенный метод.
Краткое описание алгоритма : Ø выбрать элемент, называемый опорным. Ø сравнить все остальные элементы с опорным, на основании сравнения разбить множество на три — «меньшие опорного» , «равные» и «большие» , расположить их в порядке меньшие-равные-большие. Ø повторить рекурсивно для «меньших» и «больших» . Примечание: на практике обычно разделяют сортируемое множество не на три, а на две части: например, «меньшие опорного» и «равные и большие» . Такой подход в общем случае оказывается эффективнее, так как для осуществления такого разделения достаточно одного прохода по сортируемому множеству и однократного обмена лишь некоторых выбранных элементов. v
v Псевдокод алгоритма быстрой сортировки: Процедура Quick. Sort(A: массив, min - начальный индекс, max - конечный индекс); Начало 1. Выбрать supp - элемент со средним индексом (опорный): 2. Начать просмотр с начала массива и найти элемент, больший опорного A[i]>supp 3. Начать просмотр с конца массива и найти элемент, меньший опорного A[j]<supp 4. Если предыдущие процессы ещё не пересеклись (i не больше j), то 4. 1. обменять найденные элементы местами 4. 2. Перейти к п. 2. но не с начала массива, а с места предыдущей остановки 5. Проанализировать индексы последнего обмена. 5. 1 Если i меньше max, то запустить Quick. Sort(A, i, max) 5. 2 Если j больше min, то запустить Quick. Sort(A, min, j) Конец процедуры
v Блок-схема Основная программа Функция , выполняющая обмен значений двух переменных Функция , выполняющая сортировку массива методом быстрой сортировки
v Код реализации на языке C++ #define _CRT_SECURE_NO_WARNINGS #include "stdio. h" #include "locale. h" #include <iostream> template <class X> void swap (X &a, X &b); // шаблон функции для обмена значений двух //переменных template <class V> void quick. Sort(V *umass, int l, int r) ; // шаблон функции, выполняющей //сортировку void main() { setlocale(LC_ALL, "rus"); const int N=13; int mass[N]; for (int i = 0; i<N ; i++) { printf ("Введите %i - ый элемент массива: ", i+1); if (scanf("%i", &(mass[i])) != 1) { printf("Ошибка n"); system("pause"); exit(0); } // ввод элементов массива } quick. Sort( mass, 0, N-1); printf("Измененный массив: n"); for (int i=0; i<N; i++) printf("%i ", mass[i]); printf("n"); // вывод отсортированного массива system("Pause"); }
template <class X> void swap (X &a, X &b) { X temp; temp=a; a=b; b=temp; } template <class V> void quick. Sort (V *umass, int l, int r) { V supp = *(umass+(l+r)/2); // задание опорного элемента int i = l; int j = r; while (i <= j) { while (*(umass+i) < supp) i++; while (*(umass+j) > supp) j--; if (i <= j) { swap(*(umass+i), *(umass+j)); i++; j--; } } if (i<r) quick. Sort(umass, i, r); if (l<j) quick. Sort(umass, l, j); }
v Пример выполнения программы Выполнялась сортировка массива из 13 -ти элементов, введенных пользователем
Вывод : изучен алгоритм быстрой сортировки и его реализация на языке С++ Достоинства: Ø Один из самых быстродействующих (на практике) из алгоритмов внутренней сортировки общего назначения. Ø Прост в реализации. Ø Требует лишь дополнительной памяти для своей работы. (Не улучшенный рекурсивный алгоритм в худшем случае памяти) Недостатки: Ø Сильно деградирует по скорости (до Θ(n 2)) при неудачных выборах опорных элементов, что может случиться при неудачных входных данных. Этого можно избежать, используя такие модификации алгоритма, как Introsort, или вероятностно, выбирая опорный элемент случайно, а не фиксированным образом
Алгоритм быстрой сортировки.pptx