Quicksort

Från Unix.se, den fria unixresursen.

Quicksort är en sorteringsalgoritm för jämförelsebaserad sortering som bygger på algoritmkonstruktionsmönstret dekomposition. Den beskrevs först av C. A. R. Hoare på 60-talet. Quicksort använder i genomsnitt Θ(n log n) jämförelser för att sortera n element. I värsta fall krävs dock Θ(n2) jämförelser, vilket gör att Quicksort i teorin är ett sämre val än Mergesort eller Heapsort. Med vissa modifikationer till algoritmen kan dock det teoretiska värsta fallet förbättras.

Innehåll

Modifikationer

Man brukar använda medianen av tre (första, mittersta, sista) för att minska risken att uppnå Θ(n2) jämförelser, något som kan inträffa om elementen redan är sorterade vid inmatning. Ännu bättre ur värstafallssynpunkt är att använda Select.

Implementationer

Prolog

qsort(L,S):-qs(L,[],S).
qs([],A,A).
qs([H|T],A,S):-pivoting(H,T,L1,L2),qs(L1,A,S1),qs(L2,[H|S1],S)

Lisp

(defun qsort (lst &aux (h (pop lst)))
  (macrolet ((f (x) `(qsort (remove-if (lambda (z) (,x z h)) lst))))
    (when h `(,@(f >=) ,h ,@(f <)))))

Haskell

qsort [] = []
qsort (h:t) = qsort  (filter (<h) t) ++ [h] ++ qsort (filter (>=h) t)

J

qsort =: ]`(($:@:((}.<:{.)#}.)),{.,($:@:((}.>{.)#}.)))@.(*@#)

O'Caml

let rec quicksort = function
    [] -> []
  | e :: es ->
      let left, right = List.partition (function x -> x > e) es in
      (quicksort left) @ e :: (quicksort right) 
;;
Personliga verktyg