Løst: quicksort

Sidste ændring: 09/11/2023

Quicksort er en af ​​de mest effektive sorteringsalgoritmer, der kan prale af en gennemsnitlig tidskompleksitet på O(n log n). Baseret på opdel-og-hersk-metoden udviser den en imponerende ydeevne ved sortering af store datasæt. Opfundet af den britiske datalog Tony Hoare i 1959 og udgivet i 1961, er quicksort blevet en grundlæggende del af datalogi og programmering.

Quicksort's Populariteten skyldes også dens lette implementering i forskellige programmeringssprog. I denne artikel vil vi dykke ned i, hvordan quicksort kan implementeres ved hjælp af Haskell-programmeringssproget, et statisk-typet funktionelt programmeringssprog kendt for sin renhed, kortfattethed og elegance.

Hvordan virker Quicksort?

Quicksort fungerer ved at vælge en 'pivot' fra datasættet og opdele de andre elementer i to grupper – dem, der er mindre end pivoten og dem, der er større end pivoten. Dette trin, kendt som 'partitionering', udføres rekursivt, indtil listen er sorteret.

quicksort :: Ord a => [a] -> [a]
quicksort [] = []
quicksort (p:xs) = (quicksort lesser) ++ [p] ++ (quicksort greater)
    where
        lesser  = filter (<  p) xs
        greater = filter (>= p) xs

Ovenstående Haskell-kode begynder med at definere et basistilfælde for en tom liste, som returnerer en tom liste. For en ikke-tom liste vælger den en pivot (i dette tilfælde det første element på listen), og filtrerer derefter resten af ​​listen i to underlister – en med elementer mindre end pivoten og en med elementer større end eller lig med pivot.

Forståelse af Haskell-implementeringen

I vores Haskell-implementering gør vi brug af sprogets kraftfulde listeforståelse og højere-ordens funktioner.

Kodelinjen "(hurtigsort mindre) ++ [p] ++ (hurtigsort større)" fanger kortfattet essensen af ​​kviksort - den sorterer rekursivt både de "mindre" og "større" underlister og sammenkæder derefter disse sorterede underlister med pivoten i midten. Dette er split og hersk-strategien i aktion.

På trods af sin enkelhed kan denne implementering være ineffektiv for større lister, da den filtrerer hver underliste to gange. Ikke desto mindre tjener det som et godt udgangspunkt for at forstå, hvordan quicksort fungerer i Haskell.

Haskell Programmering og Quicksort

Elegancen og enkelheden ved quicksort i Haskell understøtter styrkerne ved funktionel programmering. Kodens kortfattethed peger også på Haskells kraftfulde listeoperationer.

Haskells statiske indtastning forhindrer mange potentielle fejl på kompileringstidspunktet, mens dens renhed (ingen bivirkninger) og dovne evaluering (beregninger udføres ikke, før de er nødvendige) i høj grad letter ræsonnement om og optimering af kode.

I sidste ende er quicksort ikke bare en effektiv sorteringsalgoritme, men et vidnesbyrd om kraften i funktionel programmering og Haskells styrker som sprog.

Relaterede indlæg: