Быстрая сортировка (quicksort) Быстрая сортировка является одним из самых быстрых алгоритмов сортировки массивов. Скорость работы примерно равна O(n log n) операций при сортировке n элементов. Описание работы алгоритма:
— Из массива выбираем некоторый опорный элемент p;
— Делим массив на два подмассива, слева от p элементы меньшие либо равные p, а справа — большие либо равные p;
— Для каждого с подмассивов следует проделать ту же операцию, если в них более одного элемента.
Пошаговая работа сортировки:
5271|93811// начальная последовательность 5271|83911 5231|87911 12|35|87|911 12|35|78|911// результат
Реализация алгоритма:
#include <iostream> #include <cstdlib> // для Visual C++ заменить на <ctime> usingnamespace std;
constint SIZE =25; int array[SIZE];
// заполнение массива случайными числами voidGenerationArray() { // привязка ко времени для генерации чисел без повторений srand(time(0));
// High и Low - верхняя и нижняя границы подмассива, который надо отсортировать voidQuickSort(longintHigh,longintLow) { long i, j;// для хранения границ подмассива int p;// для хранения опорного элемента int temp;
i =Low;// делаем копию нижней границы j =High;// делаем копию верхней границы
p = array[(Low+High)/2];// выбираем опорный элемент
// цикл будет работать, пока границы не пересекутся в массиве do { // если элемент нижней границы меньше опорного элемента, // передвигаем указатель i на один элемент вправо while(array[i]< p) i++; // если элемент верхней границы меньше опорного элемента, // передвигаем указатель j на один элемент влево while(array[j]> p) j--;
// если границы не пересеклись по позициям в массиве, // меняем местами элементы i и j if(i <= j) { temp = array[i]; array[i]= array[j]; array[j]= temp;
i++; j--; } }while(i <= j);
// если в выделенном подмассиве [Low, j] больше одного элемента, // запускаем рекурсивно функцию QuickSort(long, long) if(j >Low)QuickSort(j,Low);
// аналогично if(High> i)QuickSort(High, i); }
int main() { GenerationArray();
ShowArray();
QuickSort(SIZE-1,0);
ShowArray();
return0; }
Сравнение скорости с сортировкой пузырьком и сортировкой выбором
В прошлой статье я сортировал 100 тысяч элементов сортировкой пузырьком (1 минута 38.731 секунд) и сортировкой выбором (28.313 секунд). Быстрая сортировка отсортировала столько же элементов за 0.024 секунды. Разница заметна :)
На сортировку 10 миллионов элементов ушло 2.333 секунды, в то время как на сортировку пузырьком 10 млн элементов ушло бы почти 23 месяца.
Если я правильно понял, то при вызове QuickSort в Low передается ноль.
Когда выбирается опорный эл-нт там идёт сложение Low (т.е. нуля) с High.
Для чего там идет сложение с нулём?
Когда выбирается опорный эл-нт там идёт сложение Low (т.е. нуля) с High.
Для чего там идет сложение с нулём?
То есть пятый элемент по счету. И далее будем делать то же самое с подмассивами, например в 5-ого элемента по 9-тый:
Вот мы нашли следующий опорный элемент. Как видите у нас рекурсивная функция, которая параллельно сортирует левую и правую границы подмассивов:
Функция имеет общий вид, и нет смысла делать исключение только для первого вызова.