GeeksforGeeks (Svenska)

Liksom Merge Sort är QuickSort en Divide and Conquer-algoritm. Det väljer ett element som pivot och partitionerar den givna matrisen runt den valda pivoten. Det finns många olika versioner av quickSort som väljer pivot på olika sätt.

  1. Välj alltid det första elementet som pivot.
  2. Välj alltid det senaste elementet som pivot (implementeras nedan)
  3. Välj ett slumpmässigt element som pivot.
  4. Välj median som pivot.

Nyckelprocessen i quickSort är partition (). Målet för partitionerna är, ges en matris och ett element x av matrisen som pivot, placerar x på rätt position i den sorterade matrisen och placerar alla mindre element (mindre än x) före x och placerar alla större element (större än x) efter x. Allt detta bör göras linjärt.

Pseudokod för rekursiv QuickSort-funktion:

Partitionsalgoritm
Det kan finnas många sätt att göra partitionering, efter att pseudokoden använder metoden i CLRS-boken. Logiken är enkel, vi börjar från elementet längst till vänster och håller reda på index för mindre (eller lika med) element som i. Om vi hittar ett mindre element byter vi det aktuella elementet med arr medan vi går igenom. Annars ignorerar vi nuvarande element.

Pseudokod för partition ()

Illustration av partition ():

Implementering:
Följande är implementeringarna av QuickSort:

Output:

Sorted array:1 5 7 8 9 10

Analys av QuickSort
Den tid som QuickSort tar i allmänhet kan skrivas enligt följande.

 T(n) = T(k) + T(n-k-1) + (n)

De första två termerna är för två rekursiva samtal, den sista termen är för partitionsprocessen. k är antalet element som är mindre än pivot.
Den tid som QuickSort tar beror på inmatningsmatrisen och partitionsstrategin. Följande är tre fall.

Värsta fall: Det värsta fallet inträffar när partitionsprocessen alltid väljer det största eller minsta elementet som led. Om vi överväger ovanstående partitionsstrategi där det sista elementet alltid väljs som pivot, skulle det värsta fallet inträffa när arrayen redan är sorterad i ökande eller minskande ordning. Följande är återfall i värsta fall.

 T(n) = T(0) + T(n-1) + (n)which is equivalent to T(n) = T(n-1) + (n)

Lösningen av ovanstående upprepning är (n2).

Bästa fall: Det bästa fallet inträffar när partitionsprocessen alltid väljer mittelement som pivot. Följande är återfall för bästa fall.

 T(n) = 2T(n/2) + (n)

Lösningen för ovanstående upprepning är (nLogn). Det kan lösas med hjälp av fall 2 i Master Theorem.

Genomsnittligt fall:
För att göra genomsnittlig fallanalys måste vi överväga all möjlig permutation av array och beräkna den tid det tar för varje permutation som inte se enkelt ut.
Vi kan få en uppfattning om genomsnittligt fall genom att överväga fallet när partitionen sätter O (n / 9) -element i en uppsättning och O (9n / 10) -element i en annan uppsättning. Följande är återkommande för detta fall.

 T(n) = T(n/9) + T(9n/10) + (n)

Lösning av ovanstående återfall är också O (nLogn)

Även om QuickSorts värsta fallkomplexitet är O (n2), är mer än många andra sorteringsalgoritmer som Merge Sort och Heap Sort, är QuickSort snabbare i praktiken, eftersom dess inre slinga kan implementeras effektivt på de flesta arkitekturer och i de flesta verkliga data. QuickSort kan implementeras på olika sätt genom att ändra valet av pivot, så att det värsta fallet sällan inträffar för en viss typ av data. Sammanfogningssorter anses dock generellt sett vara bättre när data är enorma och lagras i extern lagring.

Är QuickSort stabil?
Standardimplementeringen är inte stabil. Vilken sorteringsalgoritm som helst kan dock göras stabil genom att betrakta index som jämförelseparameter.
Är QuickSort på plats?
Enligt den breda definitionen av platsalgoritm kvalificerar den sig som en platssorteringsalgoritm eftersom den använder extra utrymme endast för att lagra rekursiva funktionsanrop men inte för att manipulera ingången.

Hur implementerar jag QuickSort för länkade listor?
QuickSort på Singly Linked List
QuickSort på dubbelt länkad lista

Kan vi implementera QuickSort Iterativt?
Ja, se Iterativ snabbsortering.

Varför snabbsortering föredras framför MergeSort för sortering av arrays
Snabbsortering i sin allmänna form är en platssortering (dvs det kräver inget extra lagringsutrymme) medan sammanslagningssortering kräver O (N) extra lagring, N betecknar matrisstorleken som kan vara ganska dyr. Tilldelning och avallokering av det extra utrymme som används för sammanslagningssortering ökar algoritmens körtid. Jämförelse av genomsnittlig komplexitet finner vi att båda typerna har O (NlogN) genomsnittlig komplexitet men konstanterna skiljer sig åt. För matriser tappar sammanslagningssortering på grund av användningen av extra O (N) -lagringsutrymme.

De flesta praktiska implementeringar av Quick Sort använder randomiserad version. Den randomiserade versionen har förväntat sig tidskomplexiteten för O (nLogn).Det värsta fallet är också möjligt i randomiserad version, men i värsta fall inträffar inte för ett visst mönster (som sorterad array) och randomiserad Quick Sort fungerar bra i praktiken.

Quick Sort är också en cachevänlig sortering algoritm eftersom den har bra referensplats när den används för matriser.

Snabb sortering är också svansrekursiv, därför görs optimering av svanssamtal.

Varför MergeSort är att föredra framför QuickSort för länkade listor ?
När det gäller länkade listor är fallet annorlunda, främst på grund av skillnad i minnesallokering av arrays och länkade listor. Till skillnad från matriser kan länkade listnoder kanske inte ligga i minnet. Till skillnad från array, i länkad lista, kan vi infoga objekt i mitten i O (1) extra utrymme och O (1) tid. Därför kan sammanslagning av sammanslagningssortering implementeras utan extra utrymme för länkade listor.

I matriser kan vi göra slumpmässig åtkomst eftersom elementen är kontinuerliga i minnet. Låt oss säga att vi har ett heltal (4-byte) array A och låt adressen A vara x då för att komma åt A, vi kan direkt komma åt minnet vid (x + i * 4). Till skillnad från matriser kan vi inte göra slumpmässig åtkomst i länkad lista. Snabbsortering kräver mycket av denna typ av åtkomst. I en länkad lista för att komma åt ith-index måste vi resa varje nod från huvudet till ith-nod eftersom vi inte har ett kontinuerligt minnesblock. Därför ökar omkostnaderna för snabb sortering. Sammanfoga sorterar åtkomst till data sekventiellt och behovet av slumpmässig åtkomst är lågt.

Hur optimerar jag QuickSort så att det tar O (Log n) extra utrymme i värsta fall?
Se QuickSort Tail Call Optimization (Minskar värst fallutrymme till Log n)

Ögonblicksbilder:

  • Quiz på QuickSort
  • Senaste artiklar om QuickSort
  • Kodning för sortering.

Andra sorteringsalgoritmer på GeeksforGeeks / GeeksQuiz:
Urvalssortering, Bubblesortering, Insättningssortering, Sammanfoga sortering, Högsortering, Snabbsortering , Radix-sortering, Räkningssortering, Bucket-sortering, ShellSort, Kombsortering, Pigeonhole-sortering

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *