quick sort c with examples
Брзи сортирање на Ц ++ са илустрацијом.
Куицксорт је широко коришћени алгоритам за сортирање који бира одређени елемент под називом „пивот“ и раздваја низ или листу да се сортира на два дела на основу овог стожера с0 да су елементи мањи од пивота лево од листе и елементи већи од стожера налазе се десно од листе.
Тако је листа подељена на две подлисте. Подлисте можда неће бити потребне за исту величину. Тада се Куицксорт рекурзивно позива да сортира ове две подлисте.
=> Овде погледајте савршен водич за обуку за Ц ++.
Шта ћете научити:
- Увод
- Општи алгоритам
- Псеудо код за брзи сортирање
- Илустрација
- Пример Ц ++
- Пример Јаве
- Анализа сложености алгоритма брзог сортирања
- Тросмерни Куицксорт
- Рандомизед Куицксорт
- Куицксорт вс. Мерге Сорт
- Закључак
- Препоручено читање
Увод
Куицксорт делује ефикасно и брже чак и за веће низове или листе.
У овом упутству ћемо истражити више о раду Куицксорт-а заједно са неким примерима програмирања алгоритма брзог сортирања.
Као стожерну вредност можемо одабрати прву, последњу или средњу вредност или било коју случајну вредност. Општа идеја је да се на крају пивот вредност поставља на одговарајући положај у низу померањем осталих елемената у лево или десно.
Општи алгоритам
Општи алгоритам за Куицксорт је дат у наставку.
quicksort(A, low, high) begin Declare array A(N) to be sorted low = 1st element; high = last element; pivot if(low Погледајмо сада псеудокод за Куицксорт технику.
Псеудо код за брзи сортирање
//pseudocode for quick sort main algorithm procedure quickSort(arr(), low, high) arr = list to be sorted low – first element of array high – last element of array begin if (low У наставку је описан рад алгоритма за партиционирање на примеру.

На овој илустрацији последњи елемент узимамо као осовину. Видимо да се низ сукцесивно дели око пивот елемента све док у низу не добијемо један елемент.
Сада доносимо илустрацију Куицксорт-а у наставку да бисмо боље разумели концепт.
Илустрација
Погледајмо илустрацију алгоритма брзог сортирања. Сматрајте следећи низ са последњим елементом као осовину. Такође, први елемент је означен ниским, а последњи висок.

најбоље оцењени иоутубе то мп3 цонвертер
Из илустрације видимо да померамо показиваче високо и ниско на оба краја низа. Кад год ниске тачке покажу на елемент већи од осовине, а високе тачке на елемент мањи од осовине, тада размењујемо положаје ових елемената и померамо ниске и високе показиваче у њиховим правцима.
То се ради све док се ниски и високи показивачи не укрсте. Једном када се прелазе, пивот елемент се поставља на одговарајући положај и низ се дели на два дела. Тада се оба ова подниза сортирају независно користећи рекордно брзо сортирање.
Пример Ц ++
Доље је дата примена Куицксорт алгоритма у Ц ++.
#include using namespace std; // Swap two elements - Utility function void swap(int* a, int* b) { int t = *a; *a = *b; *b = t; } // partition the array using last element as pivot int partition (int arr(), int low, int high) { int pivot = arr(high); // pivot int i = (low - 1); for (int j = low; j <= high- 1; j++) { //if current element is smaller than pivot, increment the low element //swap elements at i and j if (arr(j) <= pivot) { i++; // increment index of smaller element swap(&arr(i), &arr(j)); } } swap(&arr(i + 1), &arr(high)); return (i + 1); } //quicksort algorithm void quickSort(int arr(), int low, int high) { if (low < high) { //partition the array int pivot = partition(arr, low, high); //sort the sub arrays independently quickSort(arr, low, pivot - 1); quickSort(arr, pivot + 1, high); } } void displayArray(int arr(), int size) { int i; for (i=0; i < size; i++) cout< Излаз:
Улазни низ
12 23 3 43 51 35 19 45
Низ сортиран са брзим сортирањем
3 12 19 23 35 43 45 51
Овдје имамо неколико рутина које се користе за партиционирање низа и рекурзивно позивање брзог сортирања за сортирање партиције, основне функције брзог сортирања и услужних функција за приказ садржаја низа и замјену два елемента у складу с тим.
Прво позивамо функцију брзог сортирања са улазним низом. Унутар функције брзог сортирања називамо партицијску функцију. У функцији партиције користимо последњи елемент као стожерни елемент низа. Једном када се одлучи за пивот, низ је подељен на два дела, а затим се позива функција брзог сортирања да независно сортира оба подниза.
Када се функција брзог сортирања врати, низ се сортира тако да се елемент пивот налази на тачном месту, а елементи мањи од пивота лево од пивота, а елементи већи од пивота десно од пивота.
Даље ћемо применити алгоритам брзог сортирања на Јави.
Пример Јаве
// Quicksort implementation in Java class QuickSort { //partition the array with last element as pivot int partition(int arr(), int low, int high) { int pivot = arr(high); int i = (low-1); // index of smaller element for (int j=low; j Излаз:
Улазни низ
12 23 3 43 51 35 19 45
Низ након сортирања са брзим сортирањем
3 12 19 23 35 43 45 51
И у имплементацији Јаве користили смо исту логику као и у примени Ц ++. Користили смо последњи елемент у низу док се пивот и брзи сорти изводе на низу како би се пивот елемент ставио на одговарајући положај.
Анализа сложености алгоритма брзог сортирања
Вријеме потребно сортирању низа за сортирање низа зависи од улазног низа и стратегије или методе партиције.
Ако је к број елемената мањи од осовине, а н укупан број елемената, тада опште време потребно брзом сортирању може се изразити на следећи начин:
најбољи бесплатни софтвер за чишћење рачунара
Т (н) = Т (к) + Т (н-к-1) + О (н)
Овде су Т (к) и Т (н-к-1) време које је потребно рекурзивним позивима, а О (н) је време потребно партиционом позиву.
Детаљно ћемо анализирати ову временску сложеност за брзи сортирање.
# 1) Најгори случај : Најгори случај у техници брзог сортирања јавља се углавном када као стожер изаберемо најнижи или највиши елемент у низу. (На горњој илустрацији изабрали смо највиши елемент као стожер). У таквој ситуацији се догоди најгори случај када је низ који се сортира већ сортиран у растућем или опадајућем редоследу.
Отуда се горњи израз за укупно потребно време мења као:
Т (н) = Т (0) + Т (н-1) + О (н) то решава да Надва)
# 2) Најбољи случај: Најбољи случај за брзи сортирање увек се јавља када је изабрани пивот елемент средина низа.
Стога је понављање за најбољи случај:
који програм отвара јсон датотеку
Т (н) = 2Т (н / 2) + О (н) = О (нлогн)
# 3) Просечан случај: Да бисмо анализирали просечни случај за брзи сортирање, требали бисмо размотрити све пермутације низа, а затим израчунати време потребно за сваку од ових пермутација. Укратко, просечно време за брзи сортирање такође постаје О (нлогн).
Доље су дати различити сложеници за Куицксорт технику:
Најгора временска сложеност О (н 2) стабилност Нестабилно јер се два елемента са истим вредностима неће сместити у исти редослед. Стабилно - два елемента са истим вредностима појавит ће се у истом редоследу у сортираном излазу. Најбоља временска сложеност О (н * лог н) Просечна временска сложеност О (н * лог н) Сложеност простора О (н * лог н)
Можемо да имплементирамо брзи сортирање на много различитих начина само променом избора елемента осовине (средњи, први или последњи), међутим, најгори случај се ретко дешава за брзи сортирање.
Тросмерни Куицксорт
У оригиналној техници брзог сортирања обично бирамо елемент осовине, а затим поделимо низ на под-низове око овог осовине тако да се један под-низ састоји од елемената мањих од осовине, а други од елемената већих од осовине.
Али шта ако изаберемо пивот елемент и у низу је више од једног елемента који је једнак пивот?
На пример, размотрите следећи низ {5,76,23,65,4,4,5,4,1,1,2,2,2,2}. Ако изведемо једноставну брзу сортацију на овом низу и изаберемо 4 као стожерни елемент, тада ћемо поправити само једну појаву елемента 4, а остатак ће бити подељен заједно са осталим елементима.
Уместо тога, ако користимо тросмерни брзи сортирање, тада ћемо поделити низ (л ... р) на три подниза како следи:
- Низ (л… и) - Овде је и пивот и овај низ садржи елементе мање од пивота.
- Низ (и + 1… ј-1) - Садржи елементе који су једнаки осовини.
- Низ (ј… р) - Садржи елементе веће од осовине.
Тако се тросмерни брзи сортир може користити када имамо више од једног сувишног елемента у низу.
Рандомизед Куицксорт
Техника брзог сортирања назива се техника рандомизованог брзог сортирања када користимо случајне бројеве за избор елемента осовине. У рандомизованом брзом сортирању назива се „централни стожер“ и дели низ на такав начин да свака страна има најмање ¼ елемената.
Псеудо-код за насумични брзи сортиран је дат у наставку:
// Sorts an array arr(low..high) using randomized quick sort randomQuickSort(array(), low, high) array – array to be sorted low – lowest element in array high – highest element in array begin 1. If low >= high, then EXIT. //select central pivot 2. While pivot 'pi' is not a Central Pivot. (i) Choose uniformly at random a number from (low..high). Let pi be the randomly picked number. (ii) Count elements in array(low..high) that are smaller than array(pi). Let this count be a_low. (iii) Count elements in array(low..high) that are greater than array(pi). Let this count be a_high. (iv) Let n = (high-low+1). If a_low >= n/4 and a_high >= n/4, then pi is a central pivot. //partition the array 3. Partition array(low..high) around the pivot pi. 4. // sort first half randomQuickSort(array, low, a_low-1) 5. // sort second half randomQuickSort(array, high-a_high+1, high) end procedure
У горњем коду на „рандомКуицкСорт“, у кораку # 2 бирамо централни стожер. У кораку 2, вероватноћа да је изабрани елемент централни стожер је ½. Стога се очекује да се петља у кораку 2 изврши 2 пута. Стога је временска сложеност за корак 2 у насумичном брзом сортирању О (н).
Коришћење петље за одабир централне осовине није идеалан начин за примену рандомизоване брзе сорте. Уместо тога, можемо насумично одабрати елемент и назвати га централним осовиницама или репрограмирати елементе низа. Очекивана временска сложеност у најгорем случају за случајни алгоритам брзог сортирања је О (нлогн).
Куицксорт вс. Мерге Сорт
У овом одељку ћемо размотрити главне разлике између брзог сортирања и спајања.
Параметар поређења Брзо сортирање Сортирање спајањем преграђивање Низ је подељен око пивот елемента и није нужно увек на две половине. Може се поделити у било ком омјеру. Низ је подељен на две половине (н / 2). Најгора сложеност случаја О (н 2) - у најгорем случају је потребно пуно поређења. О (нлогн) - исто као и просечан случај Коришћење скупова података Не може добро да функционише са већим скуповима података. Добро функционише са свим скуповима података, без обзира на величину. Додатни простор На месту - не треба додатни простор. Није на месту - потребан му је додатни простор за складиштење помоћног низа. Метода сортирања Интерно - подаци се сортирају у главној меморији. Спољна - користи спољну меморију за чување низова података. Ефикасност Брже и ефикасније за листе малих величина. Брзо и ефикасно за веће листе. Низови / повезане листе Преферира се за низове. Добро функционише за повезане листе.
Закључак
Као што и само име сугерише, брзи сортирање је алгоритам који листу сортира брзо од било ког другог алгоритма за сортирање. Баш као сортирање спајањем, брзо сортирање такође усваја стратегију подели и освоји.
Као што смо већ видели, помоћу брзог сортирања списак делимо на поднизове помоћу пивот елемента. Тада се ови под-низови независно сортирају. На крају алгоритма, читав низ је потпуно сортиран.
Куицксорт је бржи и ефикасно ради на сортирању структура података. Куицксорт је популаран алгоритам за сортирање и понекад је чак пожељнији од алгоритма за спајање.
У нашем следећем упутству детаљно ћемо разговарати о сортирању шкољки.
=> Овде припазите на једноставне серије обуке за Ц ++.
Препоручено читање
- МонгоДБ метода сортирања () са примерима
- Уник наредба за сортирање са синтаксом, опцијама и примерима
- Споји сортирање у Ц ++ са примерима
- Сортирање гомиле у Ц ++ са примерима
- Сортирање љуске на Ц ++ са примерима
- Сортирање избора у Ц ++ са примерима
- Мехурићи сортирани на Ц ++ са примерима
- Сортирање уметања у Ц ++ са примерима