Algorytm szybkiego sortowania w JavaScenariusz

Co to jest szybkie sortowanie?

Szybkie sortowanie algorytm stosuje podejล›cie Dziel i zwyciฤ™ลผaj. Dzieli elementy na mniejsze czฤ™ล›ci na podstawie pewnego warunku i wykonuje operacje sortowania na tych podzielonych mniejszych czฤ™ล›ciach.

Algorytm Quick Sort jest jednym z najczฤ™ล›ciej uลผywanych i najpopularniejszych algorytmรณw w dowolnym jฤ™zyku programowania. Ale jeล›li jesteล› JavaJeล›li jesteล› programistฤ… skryptรณw, to pewnie sล‚yszaล‚eล› o sortowaฤ‡() ktรณry jest juลผ dostฤ™pny w JavaSkrypt. Wtedy pewnie zastanawiaล‚eล› siฤ™, po co ten algorytm Quick Sort. Aby to zrozumieฤ‡, najpierw musimy wiedzieฤ‡, czym jest sortowanie i jakie jest domyล›lne sortowanie w JavaScenariusz.

Co to jest sortowanie?

Sortowanie to nic innego jak ukล‚adanie elementรณw w kolejnoล›ci, w jakiej chcemy. Byฤ‡ moลผe spotkaล‚eล› siฤ™ z tym w szkole lub na studiach. Podobnie jak ukล‚adanie liczb od mniejszej do wiฤ™kszej (rosnฤ…co) lub od wiฤ™kszej do mniejszej (malejฤ…co) to to, co widzieliล›my do tej pory i nazywa siฤ™ to sortowaniem.

Domyล›lne sortowanie JavaScenariusz

Jak wczeล›niej wspomniano, JavaSkrypt ma sortowaฤ‡(). Weลบmy przykล‚ad z kilkoma tablicami elementรณw, takimi jak [5,3,7,6,2,9] i chcemy posortowaฤ‡ te elementy tablicy w kolejnoล›ci rosnฤ…cej. Zadzwoล„ sortowaฤ‡() on items array i sortuje elementy tablicy w kolejnoล›ci rosnฤ…cej.

Domyล›lne sortowanie JavaScenariusz

Code:

var items = [5,3,7,6,2,9];
console.log(items.sort());
//prints [2, 3, 5, 6, 7, 9]

Jaki jest powรณd, aby wybraฤ‡ sortowanie szybkie zamiast sortowania domyล›lnego () w JAVASCRIPT

Chociaลผ metoda sort() daje poลผฤ…dany wynik, problem leลผy w sposobie sortowania elementรณw tablicy. Domyล›lne sortowanie() w JavaSkrypt uลผywa sortowanie przez wstawianie by Silnik V8 Chrome oraz Scal sortowanie by Mozilla Firefox oraz Safari.

Ale w innych przypadkach nie jest to odpowiednie, jeล›li chcesz posortowaฤ‡ duลผฤ… liczbฤ™ elementรณw. Rozwiฤ…zaniem jest wiฤ™c uลผycie szybkiego sortowania dla duลผego zbioru danych.

Aby wiฤ™c w peล‚ni zrozumieฤ‡, musisz wiedzieฤ‡, jak dziaล‚a szybkie sortowanie, i przyjrzyjmy siฤ™ temu teraz szczegรณล‚owo.

Co to jest sortowanie szybkie?

Nastฤ™puje szybkie sortowanie Dziel i rzฤ…dลบ algorytm. Dzieli elementy na mniejsze czฤ™ล›ci na podstawie pewnego warunku i wykonuje operacje sortowania na tych podzielonych mniejszych czฤ™ล›ciach. Dlatego dziaล‚a dobrze w przypadku duลผych zestawรณw danych. Oto kroki, jak dziaล‚a szybkie sortowanie w prostych sล‚owach.

  1. Najpierw wybierz element, ktรณry ma zostaฤ‡ wywoล‚any jako przestawny elementem.
  2. Nastฤ™pnie porรณwnaj wszystkie elementy tablicy z wybranym elementem obrotowym i uล‚รณลผ je w taki sposรณb, aby elementy mniejsze od elementu obrotowego znajdowaล‚y siฤ™ po jego lewej stronie, a wiฤ™ksze niลผ element obrotowy po jego prawej stronie.
  3. Na koniec wykonaj te same operacje na elementach po lewej i prawej stronie elementu obrotowego.

Oto podstawowy zarys szybkiego sortowania. Oto kroki, ktรณre naleลผy wykonaฤ‡ jeden po drugim, aby wykonaฤ‡ szybkie sortowanie.

Jak dziaล‚a QuickSort

  1. Najpierw znajdลบ "sworzeล„" element tablicy.
  2. Rozpocznij lewy wskaลบnik od pierwszego elementu tablicy.
  3. Uruchom prawy wskaลบnik na ostatnim elemencie tablicy.
  4. Porรณwnaj element wskazujฤ…cy lewym wskaลบnikiem i jeล›li jest mniejszy od elementu obrotowego, to przesuล„ lewy wskaลบnik w prawo (dodaj 1 do lewego indeksu). Kontynuuj tฤ™ czynnoล›ฤ‡, aลผ lewy element bฤ™dzie wiฤ™kszy lub rรณwny elementowi obrotowemu.
  5. Porรณwnaj element wskazujฤ…cy prawym wskaลบnikiem i jeล›li jest wiฤ™kszy od elementu obrotowego, przesuล„ prawy wskaลบnik w lewo (subtract 1 do prawego indeksu). Kontynuuj tak, aลผ element po prawej stronie bฤ™dzie mniejszy lub rรณwny elementowi obrotowemu.
  6. Sprawdลบ, czy lewy wskaลบnik jest mniejszy lub rรณwny prawemu wskaลบnikowi, a nastฤ™pnie zamieล„ elementy w lokalizacjach tych wskaลบnikรณw.
  7. Zwiฤ™ksz lewy wskaลบnik i zmniejsz prawy wskaลบnik.
  8. Jeลผeli indeks lewego wskaลบnika jest w dalszym ciฤ…gu mniejszy niลผ indeks prawego wskaลบnika, to powtรณrz proces; w przeciwnym razie zwrรณฤ‡ indeks lewego wskaลบnika.

Jak dziaล‚a QuickSort

Zobaczmy wiฤ™c te kroki na przykล‚adzie. Rozwaลผmy tablicฤ™ elementรณw, ktรณre musimy posortowaฤ‡, to [5,3,7,6,2,9].

Okreล›l element obrotowy

Zanim jednak przejdziemy do sortowania szybkiego, gล‚รณwnฤ… rolฤ™ odgrywa wybranie elementu przestawnego. Jeล›li wybierzesz pierwszy element jako element przestawny, uzyskasz najgorszฤ… wydajnoล›ฤ‡ w posortowanej tablicy. Dlatego zawsze zaleca siฤ™ wybranie ล›rodkowego elementu (dล‚ugoล›ฤ‡ tablicy podzielona przez 2) jako elementu obrotowego i robimy to samo.

Oto kroki, jak wykonaฤ‡ szybkie sortowanie pokazane na przykล‚adzie [5,3,7,6,2,9].

KROK 1: Okreล›l oล› jako element ล›rodkowy. Wiฤ™c, 7 jest elementem obrotowym.

KROK 2: Rozpocznij lewy i prawy wskaลบnik odpowiednio jako pierwszy i ostatni element tablicy. Zatem lewy wskaลบnik wskazuje 5 o indeksie 0, na ktรณry wskazuje prawy wskaลบnik 9 w indeksie 5.

KROK 3: Porรณwnaj element przy lewym wskaลบniku z elementem obrotowym. Poniewaลผ 5 < 6 przesuwa lewy wskaลบnik w prawo do indeksu 1.

KROK 4: Teraz nadal 3 <6, wiฤ™c przesuล„ lewy wskaลบnik o jeden indeks w prawo. Wiฤ™c teraz 7 > 6 przestaล„ zwiฤ™kszaฤ‡ lewy wskaลบnik i teraz lewy wskaลบnik jest na indeksie 2.

KROK 5: Teraz porรณwnaj wartoล›ฤ‡ po prawej stronie z elementem obrotowym. Poniewaลผ 9 > 6 przesuล„ prawy wskaลบnik w lewo. Teraz, gdy 2 < 6, przestaล„ przesuwaฤ‡ prawy wskaลบnik.

KROK 6: Zamieล„ ze sobฤ… obie wartoล›ci obecne przy lewym i prawym wskaลบniku.

KROK 7: Przesuล„ oba wskaลบniki o jeden krok wiฤ™cej.

KROK 8: Poniewaลผ 6 = 6, przesuล„ wskaลบniki o jeszcze jeden krok i zatrzymaj siฤ™, gdy lewy wskaลบnik przetnie prawy wskaลบnik i zwrรณฤ‡ indeks lewego wskaลบnika.

Tak wiฤ™c, bazujฤ…c na powyลผszym podejล›ciu, musimy napisaฤ‡ kod do zamianyping elementy i partycjonowanie tablicy, jak opisano w powyลผszych krokach.

Code zamieniฤ‡ dwa numery JavaScenariusz

zamieล„ dwie liczby JavaScenariusz

function swap(items, leftIndex, rightIndex){
    var temp = items[leftIndex];
    items[leftIndex] = items[rightIndex];
    items[rightIndex] = temp;
}

Code aby wykonaฤ‡ partycjonowanie zgodnie z powyลผszymi krokami

Code wykonaฤ‡ partycjonowanie

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;
}

Wykonaj operacjฤ™ rekurencyjnฤ…

Po wykonaniu powyลผszych krokรณw zostanie zwrรณcony indeks lewego wskaลบnika, ktรณrego musimy uลผyฤ‡ do podzielenia tablicy i wykonania szybkiego sortowania tej czฤ™ล›ci. Dlatego nazywa siฤ™ to algorytmem โ€žDziel i zwyciฤ™ลผajโ€.

Zatem sortowanie szybkie jest wykonywane do momentu, aลผ wszystkie elementy lewej i prawej tablicy zostanฤ… posortowane.

Uwaga: Sortowanie szybkie odbywa siฤ™ na tej samej tablicy i nie sฤ… przy tym tworzone ลผadne nowe tablice.

Wiฤ™c musimy to nazwaฤ‡ przegroda() wyjaล›niono powyลผej i na tej podstawie dzielimy szyk na czฤ™ล›ci. Oto kod, w ktรณrym go uลผywasz,

Rekurencyjne Operacja

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);

Wypeล‚nij kod szybkiego sortowania

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]

Szybkie sortowanie

UWAGA: Szybkie sortowanie dziaล‚a ze zล‚oลผonoล›ciฤ… czasowฤ… O(nlogn).

Podsumuj ten post nastฤ™pujฤ…co: