QuickSort Algoritm in JavaScript
Vad รคr snabbsortering?
Snabb sortering Algoritmen fรถljer Divide and Conquer-metoden. Den delar upp element i mindre delar baserat pรฅ nรฅgot tillstรฅnd och utfรถr sorteringsoperationerna pรฅ de delade mindre delarna.
Quick Sort-algoritmen รคr en av de mest anvรคnda och populรคra algoritmerna i alla programmeringssprรฅk. Men om du รคr en JavaSkriptutvecklare, dรฅ kanske du har hรถrt talas om sortera() som redan finns i JavaManus. Dรฅ kanske du har tรคnkt pรฅ vad behovet av denna snabbsorteringsalgoritm รคr. Fรถr att fรถrstรฅ detta behรถver vi fรถrst vad som รคr sortering och vad som รคr standardsortering i JavaManus.
Vad รคr sortering?
Sortering รคr inget annat รคn att ordna element i den ordning vi vill. Du kanske har stรถtt pรฅ detta under din skol- eller hรถgskoletid. Som att ordna siffror frรฅn mindre till stรถrre (stigande) eller frรฅn stรถrre till mindre (fallande) รคr vad vi sett hittills och kallas sortering.
Standardinstรคllning JavaScript
Som tidigare nรคmnts, JavaManus har sortera(). Lรฅt oss ta ett exempel med fรฅ array av element som [5,3,7,6,2,9] och vill sortera dessa arrayelement i stigande ordning. Bara ring sortera() pรฅ objektmatris och den sorterar matriselement i stigande ordning.
Code:
var items = [5,3,7,6,2,9]; console.log(items.sort()); //prints [2, 3, 5, 6, 7, 9]
Vad รคr anledningen till att vรคlja Quick sort รถver standard sort() in JavaScript
รven om sort() ger det resultat vi vill ha, ligger problemet i hur det sorterar arrayelementen. Standard sort() in JavaScript anvรคnder insรคttningssortering by V8 Engine of Chrome och Slรฅ samman sortering by Mozilla Firefox och Safari.
Men i รถvrigt รคr detta inte lรคmpligt om du behรถver sortera ett stort antal element. Sรฅ lรถsningen รคr att anvรคnda snabbsortering fรถr stora datamรคngder.
Sรฅ fรถr att fรถrstรฅ helt mรฅste du veta hur Quick sortering fungerar och lรฅt oss se det i detalj nu.
Vad รคr snabbsortering?
Snabb sortering fรถljer Sรถndra och erรถvra algoritm. Det รคr att dela in element i mindre delar baserat pรฅ nรฅgot tillstรฅnd och utfรถra sorteringsoperationerna pรฅ de uppdelade mindre delarna. Dรคrfรถr fungerar det bra fรถr stora datamรคngder. Sรฅ hรคr รคr stegen hur Snabbsortering fungerar i enkla ord.
- Vรคlj fรถrst ett element som ska kallas som svรคngtappen elementet.
- Jรคmfรถr sedan alla arrayelement med det valda pivotelementet och arrangera dem pรฅ ett sรฅdant sรคtt att element mindre รคn pivotelementet รคr till vรคnster och stรถrre รคn pivot รคr till hรถger.
- Slutligen, utfรถr samma operationer pรฅ vรคnster och hรถger sidoelement till pivotelementet.
Sรฅ, det รคr grundkonturen av Quick sort. Hรคr รคr stegen som mรฅste fรถljas ett efter ett fรถr att utfรถra snabbsortering.
Hur fungerar QuickSort
- Hitta fรถrst "svรคnga" element i arrayen.
- Starta den vรคnstra pekaren vid det fรถrsta elementet i arrayen.
- Starta den hรถgra pekaren vid det sista elementet i arrayen.
- Jรคmfรถr elementet som pekar med vรคnster pekare och om det รคr mindre รคn pivotelementet, flytta sedan den vรคnstra pekaren till hรถger (lรคgg till 1 till vรคnster index). Fortsรคtt tills det vรคnstra sidoelementet รคr stรถrre รคn eller lika med pivotelementet.
- Jรคmfรถr elementet som pekar med hรถgerpekaren och om den รคr stรถrre รคn pivotelementet, flytta dรฅ hรถgerpekaren รฅt vรคnster (subtract 1 till hรถger index). Fortsรคtt detta tills elementet pรฅ hรถger sida รคr mindre รคn eller lika med pivotelementet.
- Kontrollera om den vรคnstra pekaren รคr mindre รคn eller lika med den hรถgra pekaren, byt sedan elementen pรฅ platserna fรถr dessa pekare.
- รka den vรคnstra pekaren och minska den hรถgra pekaren.
- Om index fรถr vรคnster pekare fortfarande รคr mindre รคn index fรถr hรถger pekare, upprepa sedan processen; annars returnerar indexet fรถr den vรคnstra pekaren.
Sรฅ lรฅt oss se dessa steg med ett exempel. Lรฅt oss รถvervรคga en rad element som vi behรถver sortera รคr [5,3,7,6,2,9].
Bestรคm Pivot-elementet
Men innan du gรฅr vidare med snabbsorteringen spelar valet av pivotelementet en stor roll. Om du vรคljer det fรถrsta elementet som pivotelement, ger det sรคmst prestanda i den sorterade arrayen. Sรฅ det รคr alltid tillrรฅdligt att vรคlja mittelementet (lรคngden pรฅ arrayen dividerat med 2) som pivotelementet och vi gรถr detsamma.
Hรคr รคr stegen fรถr att utfรถra snabbsortering som visas med ett exempel [5,3,7,6,2,9].
STEG 1: Bestรคm pivot som mittelement. Sรฅ, 7 รคr pivotelementet.
STEG 2: Starta vรคnster- och hรถgerpekare som fรถrsta respektive sista element i arrayen. Sรฅ vรคnsterpekaren pekar pรฅ 5 vid index 0 och hรถger pekare pekar pรฅ 9 pรฅ index 5.
STEG 3: Jรคmfรถr element vid den vรคnstra pekaren med pivotelementet. Eftersom 5 < 6 flyttar vรคnster pekare รฅt hรถger till index 1.
STEG 4: Nu, fortfarande 3 <6 sรฅ flytta vรคnster pekare till ytterligare ett index รฅt hรถger. Sรฅ nu slutar 7 > 6 att รถka den vรคnstra pekaren och nu รคr vรคnster pekare pรฅ index 2.
STEG 5: Jรคmfรถr nu vรคrdet pรฅ den hรถgra pekaren med pivotelementet. Eftersom 9 > 6 flyttar den hรถgra pekaren รฅt vรคnster. Nu som 2 < 6 sluta flytta den hรถgra pekaren.
STEG 6: Byt bรฅda vรคrdena som finns pรฅ vรคnster och hรถger pekare med varandra.
STEG 7: Flytta bรฅda pekarna ett steg till.
STEG 8: Eftersom 6 = 6, flytta pekarna till ett steg till och stanna nรคr vรคnster pekare korsar den hรถgra pekaren och returnerar indexet fรถr den vรคnstra pekaren.
Sรฅ, hรคr baserat pรฅ ovanstรฅende metod, behรถver vi skriva kod fรถr swapping element och partitionering av arrayen enligt stegen ovan.
Code att byta ut tvรฅ siffror JavaScript
function swap(items, leftIndex, rightIndex){
var temp = items[leftIndex];
items[leftIndex] = items[rightIndex];
items[rightIndex] = temp;
}
Code fรถr att utfรถra partitioneringen enligt stegen ovan
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;
}
Utfรถr den rekursiva operationen
Nรคr du har utfรถrt ovanstรฅende steg kommer index fรถr den vรคnstra pekaren att returneras och vi mรฅste anvรคnda det fรถr att dela upp arrayen och utfรถra snabbsorteringen pรฅ den delen. Dรคrfรถr kallas det Divide and Conquer-algoritm.
Sรฅ snabbsortering utfรถrs tills alla element i den vรคnstra arrayen och den hรถgra arrayen รคr sorterade.
Obs: Snabbsortering utfรถrs pรฅ samma array och inga nya arrayer skapas i processen.
Sรฅ vi mรฅste kalla detta dela() fรถrklaras ovan och utifrรฅn det delar vi upp array in i delar. Sรฅ hรคr รคr koden dรคr du anvรคnder den,
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);
Komplett snabbsorteringskod
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]
OBS: Snabbsortering kรถrs med tidskomplexiteten pรฅ O(nlogn).






