QuickSort Algorithm in JavaScénář
Co je rychlé třídění?
Rychlé třídění algoritmus se řídí přístupem rozděl a panuj. Rozděluje prvky na menší části na základě určité podmínky a provádí operace řazení na těchto rozdělených menších částech.
Algoritmus rychlého řazení je jedním z nejpoužívanějších a nejoblíbenějších algoritmů v jakémkoli programovacím jazyce. Ale pokud jste a JavaVývojář skriptů, o kterém jste možná slyšeli řadit () který je již k dispozici v JavaSkript. Pak jste možná přemýšleli, jaká je potřeba tohoto algoritmu rychlého řazení. Abychom tomu porozuměli, nejprve potřebujeme, co je třídění a jaké je výchozí třídění JavaSkript.
Co je řazení?
Třídění není nic jiného než uspořádání prvků v pořadí, jaké chceme. Možná jste se s tím setkali ve škole nebo na vysoké škole. Stejně jako řazení čísel od menších k větším (vzestupně) nebo od větších k menším (sestupně) je to, co jsme dosud viděli, a nazývá se to třídění.
Výchozí řazení v JavaScénář
Jak již bylo zmíněno dříve, JavaSkript má řadit (). Vezměme si příklad s několika prvky pole, jako je [5,3,7,6,2,9] a chceme seřadit prvky tohoto pole ve vzestupném pořadí. Prostě zavolej řadit () on items array a seřadí prvky pole ve vzestupném pořadí.
Kód:
var items = [5,3,7,6,2,9]; console.log(items.sort()); //prints [2, 3, 5, 6, 7, 9]
Jaký je důvod zvolit Rychlé řazení před výchozím řazením() v JavaScénář
Ačkoli sort() dává výsledek, který chceme, problém spočívá ve způsobu, jakým třídí prvky pole. Výchozí sort() in JavaPoužití skriptu řazení řazení by V8 motor Chrome a Sloučit třídění by Mozilla Firefox a Safari.
Ale jinak to není vhodné, pokud potřebujete třídit velké množství prvků. Řešením je tedy použití rychlého řazení pro velké datové sady.
Chcete-li tedy úplně porozumět, musíte vědět, jak rychlé řazení funguje, a nyní se na to podrobně podívat.
Co je rychlé řazení?
Následuje rychlé řazení Rozděl a panuj algoritmus. Jedná se o rozdělení prvků na menší části na základě určitých podmínek a provádění operací třídění na těchto rozdělených menších částech. Proto funguje dobře pro velké datové sady. Zde jsou tedy kroky, jak funguje Rychlé řazení jednoduchými slovy.
- Nejprve vyberte prvek, který se má volat jako střed prvek.
- Dále porovnejte všechny prvky pole s vybraným otočným prvkem a uspořádejte je tak, aby prvky menší než otočný prvek byly vlevo a větší než pivot vpravo.
- Nakonec proveďte stejné operace na levém a pravém bočním prvku k otočnému prvku.
To je základní přehled rychlého řazení. Zde jsou kroky, které je třeba provést jeden po druhém, aby bylo možné provést rychlé třídění.
Jak funguje QuickSort
- Nejprve najděte "pivot" prvek v poli.
- Začněte levým ukazatelem na prvním prvku pole.
- Začněte pravým ukazatelem na posledním prvku pole.
- Porovnejte prvek ukazující s levým ukazatelem a pokud je menší než otočný prvek, posuňte levý ukazatel doprava (přidejte 1 k levému indexu). Pokračujte tak dlouho, dokud levý boční prvek nebude větší nebo roven otočnému prvku.
- Porovnejte prvek ukazující s pravým ukazatelem a pokud je větší než otočný prvek, posuňte pravý ukazatel doleva (odečtete 1 od pravého indexu). Pokračujte tak dlouho, dokud prvek pravé strany nebude menší nebo roven otočnému prvku.
- Zkontrolujte, zda je levý ukazatel menší nebo roven pravému ukazateli, a poté vyměňte prvky v umístění těchto ukazatelů.
- Zvyšte levý ukazatel a snižte pravý ukazatel.
- Pokud je index levého ukazatele stále menší než index pravého ukazatele, opakujte proces; jinak vrátí index levého ukazatele.
Podívejme se tedy na tyto kroky na příkladu. Uvažujme pole prvků, které potřebujeme seřadit, je [5,3,7,6,2,9].
Určete prvek Pivot
Než se však pustíte do rychlého řazení, hraje hlavní roli výběr prvku pivotu. Pokud vyberete první prvek jako pivotní prvek, bude mít nejhorší výkon v seřazeném poli. Vždy je tedy vhodné vybrat prostřední prvek (délka pole dělená 2) jako pivotový prvek a my uděláme totéž.
Zde jsou kroky k provedení rychlého třídění, které je znázorněno na příkladu [5,3,7,6,2,9].
KROK 1: Určete pivot jako prostřední prvek. Tak, 7 je otočný prvek.
KROK 2: Spusťte levý a pravý ukazatel jako první a poslední prvek pole. Takže levý ukazatel ukazuje na 5 na index 0 a pravý ukazatel ukazuje 9 na indexu 5.
KROK 3: Porovnejte prvek na levém ukazateli s prvkem pivot. Protože 5 < 6 posune levý ukazatel doprava na index 1.
KROK 4: Nyní stále 3 <6, takže posuňte levý ukazatel na další index doprava. Takže nyní 7 > 6 přestane zvyšovat levý ukazatel a nyní je levý ukazatel na indexu 2.
KROK 5: Nyní porovnejte hodnotu na pravém ukazateli s prvkem pivot. Od 9 > 6 posuňte pravý ukazatel doleva. Nyní jako 2 < 6 přestaňte pohybovat pravým ukazatelem.
KROK 6: Zaměňte obě hodnoty na levém a pravém ukazateli navzájem.
KROK 7: Posuňte oba ukazatele ještě o jeden krok.
KROK 8: Protože 6 = 6, posuňte ukazatele o jeden další krok a zastavte se, když se levý ukazatel kříží s pravým ukazatelem, a vraťte index levého ukazatele.
Na základě výše uvedeného přístupu tedy musíme napsat kód pro výměnu prvků a rozdělení pole, jak je uvedeno ve výše uvedených krocích.
Kód pro výměnu dvou čísel JavaScénář
function swap(items, leftIndex, rightIndex){ var temp = items[leftIndex]; items[leftIndex] = items[rightIndex]; items[rightIndex] = temp; }
Kód pro provedení oddílu, jak je uvedeno ve výše uvedených krocích
function partition(items, left, right) { var pivot = items[Math.floor((right + left) / 2)], //middle element i = left, //left pointer j = right; //right pointer while (i <= j) { while (items[i] < pivot) { i++; } while (items[j] > pivot) { j--; } if (i <= j) { swap(items, i, j); //swap two elements i++; j--; } } return i; }
Proveďte rekurzivní operaci
Jakmile provedete výše uvedené kroky, vrátí se index levého ukazatele a musíme jej použít k rozdělení pole a provedení rychlého řazení na této části. Proto se nazývá algoritmus rozděl a panuj.
Rychlé řazení se tedy provádí, dokud nejsou seřazeny všechny prvky v levém a pravém poli.
Poznámka: Rychlé řazení se provádí na stejném poli a v procesu se nevytvářejí žádná nová pole.
Tak to musíme nazvat rozdělit() vysvětleno výše a na základě toho dělíme řada do částí. Takže zde je kód, kde jej používáte,
function quickSort(items, left, right) { var index; if (items.length > 1) { index = partition(items, left, right); //index returned from partition if (left < index - 1) { //more elements on the left side of the pivot quickSort(items, left, index - 1); } if (index < right) { //more elements on the right side of the pivot quickSort(items, index, right); } } return items; } // first call to quick sort var result = quickSort(items, 0, items.length - 1);
Vyplňte kód rychlého řazení
var items = [5,3,7,6,2,9]; function swap(items, leftIndex, rightIndex){ var temp = items[leftIndex]; items[leftIndex] = items[rightIndex]; items[rightIndex] = temp; } function partition(items, left, right) { var pivot = items[Math.floor((right + left) / 2)], //middle element i = left, //left pointer j = right; //right pointer while (i <= j) { while (items[i] < pivot) { i++; } while (items[j] > pivot) { j--; } if (i <= j) { swap(items, i, j); //sawpping two elements i++; j--; } } return i; } function quickSort(items, left, right) { var index; if (items.length > 1) { index = partition(items, left, right); //index returned from partition if (left < index - 1) { //more elements on the left side of the pivot quickSort(items, left, index - 1); } if (index < right) { //more elements on the right side of the pivot quickSort(items, index, right); } } return items; } // first call to quick sort var sortedArray = quickSort(items, 0, items.length - 1); console.log(sortedArray); //prints [2,3,5,6,7,9]
POZNÁMKA: Rychlé řazení běží s časovou složitostí O(nlogn).