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.
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.
- Najpierw wybierz element, ktรณry ma zostaฤ wywoลany jako przestawny elementem.
- 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.
- 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
- Najpierw znajdลบ "sworzeล" element tablicy.
- Rozpocznij lewy wskaลบnik od pierwszego elementu tablicy.
- Uruchom prawy wskaลบnik na ostatnim elemencie tablicy.
- 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.
- 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.
- Sprawdลบ, czy lewy wskaลบnik jest mniejszy lub rรณwny prawemu wskaลบnikowi, a nastฤpnie zamieล elementy w lokalizacjach tych wskaลบnikรณw.
- Zwiฤksz lewy wskaลบnik i zmniejsz prawy wskaลบnik.
- 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.
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
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
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,
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]
UWAGA: Szybkie sortowanie dziaลa ze zลoลผonoลciฤ czasowฤ O(nlogn).






