QuickSort Algoritme ind JavaScript
Hvad er hurtig sortering?
Hurtig sortering Algoritmen fรธlger Divide and Conquer-tilgangen. Det opdeler elementer i mindre dele baseret pรฅ en bestemt tilstand og udfรธrer sorteringsoperationerne pรฅ de opdelte mindre dele.
Quick Sort algoritme er en af โโde mest brugte og populรฆre algoritmer i ethvert programmeringssprog. Men hvis du er en JavaScriptudvikler, sรฅ har du mรฅske hรธrt om sortere() som allerede er tilgรฆngelig i JavaManuskript. Sรฅ har du mรฅske tรฆnkt pรฅ, hvad behovet for denne hurtigsorteringsalgoritme er. For at forstรฅ dette har vi fรธrst brug for, hvad der er sortering, og hvad der er standardsortering i JavaManuskript.
Hvad er sortering?
Sortering er ikke andet end at arrangere elementer i den rรฆkkefรธlge, vi รธnsker. Du er mรฅske stรธdt pรฅ dette i din skole- eller collegetid. Ligesom at arrangere tal fra mindre til stรธrre (stigende) eller fra stรธrre til mindre (faldende) er, hvad vi sรฅ indtil nu og kaldes sortering.
Standard sortering i JavaScript
Som tidligere nรฆvnt, JavaScript har sortere(). Lad os tage et eksempel med fรฅ array af elementer som [5,3,7,6,2,9] og รธnsker at sortere disse array-elementer i stigende rรฆkkefรธlge. Bare ring sortere() pรฅ elementer array og det sorterer array elementer i stigende rรฆkkefรธlge.
Kode:
var items = [5,3,7,6,2,9]; console.log(items.sort()); //prints [2, 3, 5, 6, 7, 9]
Hvad er grunden til at vรฆlge Hurtig sortering over standard sort() i JavaScript
Selvom sort() giver det resultat, vi รธnsker, ligger problemet i den mรฅde, den sorterer array-elementerne pรฅ. Standard sort() i JavaScript bruger indsรฆtnings sortering by V8 Engine af Chrome og Flet sortering by Mozilla Firefox og Safari.
Men ellers er dette ikke egnet, hvis du skal sortere et stort antal elementer. Sรฅ lรธsningen er at bruge Hurtig sortering til store datasรฆt.
Sรฅ for at forstรฅ fuldstรฆndigt, skal du vide, hvordan Quick sortering fungerer, og lad os se det i detaljer nu.
Hvad er hurtig sortering?
Hurtig sortering fรธlger Opdele og erobre algoritme. Det opdeler elementer i mindre dele baseret pรฅ en eller anden tilstand og udfรธrer sorteringsoperationerne pรฅ de opdelte mindre dele. Derfor fungerer det godt til store datasรฆt. Sรฅ her er trinene til, hvordan Hurtig sortering fungerer i enkle ord.
- Vรฆlg fรธrst et element, der skal kaldes som pivot element.
- Dernรฆst skal du sammenligne alle array-elementer med det valgte pivotelement og arrangere dem pรฅ en sรฅdan mรฅde, at elementer mindre end pivotelementet er til venstre for det og stรธrre end pivot er til hรธjre.
- Til sidst skal du udfรธre de samme handlinger pรฅ venstre og hรธjre sideelementer til pivotelementet.
Sรฅ det er den grundlรฆggende skitse af hurtig sortering. Her er de trin, der skal fรธlges et efter et for at udfรธre Hurtig sortering.
Hvordan virker QuickSort
- Find fรธrst "omdrejningspunkt" element i arrayet.
- Start den venstre markรธr ved det fรธrste element i arrayet.
- Start den hรธjre markรธr ved det sidste element i arrayet.
- Sammenlign elementet, der peger med venstre markรธr, og hvis det er mindre end pivotelementet, sรฅ flyt venstre markรธr til hรธjre (tilfรธj 1 til venstre indeks). Fortsรฆt dette, indtil venstre sideelement er stรธrre end eller lig med pivotelementet.
- Sammenlign elementet, der peger med hรธjre pointer, og hvis det er stรธrre end pivot-elementet, sรฅ flyt hรธjre pointer til venstre (trรฆk 1 fra til hรธjre indeks). Fortsรฆt dette, indtil hรธjre sideelement er mindre end eller lig med pivotelementet.
- Tjek, om venstre markรธr er mindre end eller lig med hรธjre markรธr, og skift derefter elementerne pรฅ placeringen af โโdisse markรธrer.
- Forรธg den venstre markรธr og formindsk den hรธjre markรธr.
- Hvis indekset for venstre markรธr stadig er mindre end indekset for hรธjre markรธr, sรฅ gentag processen; ellers returnerer indekset for den venstre markรธr.
Sรฅ lad os se disse trin med et eksempel. Lad os overveje rรฆkken af โโelementer, som vi skal sortere er [5,3,7,6,2,9].
Bestem Pivot-elementet
Men fรธr du gรฅr videre med Hurtig sortering, spiller valget af pivotelementet en stor rolle. Hvis du vรฆlger det fรธrste element som pivotelement, giver det den dรฅrligste ydeevne i det sorterede array. Sรฅ det er altid tilrรฅdeligt at vรฆlge det midterste element (lรฆngden af โโarrayet divideret med 2) som pivotelementet, og vi gรธr det samme.
Her er trinene til at udfรธre Hurtig sortering, der vises med et eksempel [5,3,7,6,2,9].
TRIN 1: Bestem pivot som mellemelement. Sรฅ, 7 er pivotelementet.
TRIN 2: Start venstre og hรธjre pointere som henholdsvis fรธrste og sidste elementer i arrayet. Sรฅ venstre pointer peger pรฅ 5 ved indeks 0 og hรธjre peger peger pรฅ 9 ved indeks 5.
TRIN 3: Sammenlign element ved venstre markรธr med pivotelementet. Siden 5 < 6 flytter venstre markรธr til hรธjre til indeks 1.
TRIN 4: Nu, stadig 3 <6, sรฅ skift venstre markรธr til endnu et indeks til hรธjre. Sรฅ nu stopper 7 > 6 med at รธge den venstre markรธr og nu er venstre markรธr pรฅ indeks 2.
TRIN 5: Sammenlign nu vรฆrdien ved den hรธjre markรธr med pivotelementet. Da 9 > 6 flytter den hรธjre markรธr til venstre. Nu som 2 < 6 stop med at flytte den hรธjre markรธr.
TRIN 6: Skift begge vรฆrdier, der findes ved venstre og hรธjre pointer, med hinanden.
TRIN 7: Flyt begge markรธrer et trin mere.
TRIN 8: Da 6 = 6, skal du flytte pegepindene til et trin mere og stoppe, nรฅr venstre pegepind krydser hรธjre pegepind og returnere indekset for venstre peger.
Sรฅ her, baseret pรฅ ovenstรฅende tilgang, skal vi skrive kode til at bytte elementer og partitionere arrayet som nรฆvnt i ovenstรฅende trin.
Kode til at bytte to tal ind i JavaScript
function swap(items, leftIndex, rightIndex){
var temp = items[leftIndex];
items[leftIndex] = items[rightIndex];
items[rightIndex] = temp;
}
Kode til at udfรธre partitionen som nรฆvnt i ovenstรฅende trin
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;
}
Udfรธr den rekursive operation
Nรฅr du har udfรธrt ovenstรฅende trin, returneres indekset for den venstre markรธr, og vi skal bruge det til at opdele arrayet og udfรธre Hurtig sortering pรฅ den del. Derfor kaldes det Divide and Conquer-algoritme.
Sรฅ hurtig sortering udfรธres, indtil alle elementer i venstre array og hรธjre array er sorteret.
Bemรฆrk: Hurtig sortering udfรธres pรฅ det samme array, og der oprettes ingen nye arrays i processen.
Sรฅ vi er nรธdt til at kalde dette skillevรฆg() forklaret ovenfor og ud fra det opdeler vi matrix ind til dele. Sรฅ her er koden, hvor du bruger 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);
Komplet hurtigsorteringskode
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]
BEMรRK VENLIGST: Hurtig sortering kรธrer med tidskompleksiteten pรฅ O(nlogn).






