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í.

Výchozí řazení v JavaScénář

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.

  1. Nejprve vyberte prvek, který se má volat jako střed prvek.
  2. 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.
  3. 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

  1. Nejprve najděte "pivot" prvek v poli.
  2. Začněte levým ukazatelem na prvním prvku pole.
  3. Začněte pravým ukazatelem na posledním prvku pole.
  4. 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.
  5. 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.
  6. Zkontrolujte, zda je levý ukazatel menší nebo roven pravému ukazateli, a poté vyměňte prvky v umístění těchto ukazatelů.
  7. Zvyšte levý ukazatel a snižte pravý ukazatel.
  8. Pokud je index levého ukazatele stále menší než index pravého ukazatele, opakujte proces; jinak vrátí index levého ukazatele.

Jak funguje QuickSort

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ář

prohodit dvě čísla 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

Kód pro provedení oddílu

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,

Rekurzivní Operavání

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]

Rychlé třídění

POZNÁMKA: Rychlé řazení běží s časovou složitostí O(nlogn).