Ulike sorteringsmetoder Kompleksitet av dem
Sorteringsalgoritmer O(n2)-metoder Innsettingssortering Boblesortering Velgesortering O(nlogn)-metoder Flettesortering Quicksort Heapsort (kommer i kapittel 7) Andre metoder Shellsort Tellesortering Radikssortering
Vurderinger ved valg av sorteringsalgoritme Tidsforbruk Tidskompleksitet viktig ved store tabeller Enkel algoritme viktigere ved mindre tabeller Plassforbruk Noen algoritmer må bruke O(n) ekstra plass Hva som skal sorteres Noen algoritmer fungerer bare på spesielle typer data Noen algoritmer fungerer spesielt godt/dårlig hvis dataene kommer i bestemte rekkefølger Noen ganger er det en fordel at like elementer ikke bytter plass
Noen begreper Stigende sortering: Minste først, største sist. Motsatt: Synkende sortering Vi forutsetter stigende sortering Sorteringsnøkkel (evn bare nøkkel): Det vi sorterer etter Stabil sortering: Elementer med lik nøkkel bytter ikke plass Bare interessant hvis elementet består av mer enn nøkkelen Eks: Har studentdata sortert på navn. Ønsker å sortere på klasse. Men for studenter i samme klasse vil vi beholde rekkefølgen
O(n2) -metodene Enkle metoder som egner seg for små tabeller Innsettingssortering (alg side 50): Start med en tabell av 0 sorterte elementer Utvid gradvis den sorterte tabellen ved å sette inn ett og ett element på sortert plass Velgesortering (alg side 52): Finn minste element, plasser det først Finn så nest minste, osv.
O(nlogn)-metoder Flettesortering Quicksort Del tabellen i to, sorter hver del (rekursivt), flett sammen de to delene til en sortert tabell Quicksort Del tabellen i to ”hauger”, en for ”små”nøkler og en for ”store”. Sorter hver ”haug” (rekursivt). Når begge ”haugene” er sortert, er hele tabellen sortert
Flettesortering (alg side 56) Sorter(0, n) Sorter(0, n/2) Sorter(n/2, n/2) Sammenlign første element i den ene delen med første i den andre. Den minste plasseres i en ny tabell, og nytt element hentes for ny sammenligning. Fortsett til alle elementene er flyttet over i resultattabellen
Tidskompleksitet T(n) = 2T(n/2) + n a=2, b=2, c=1, k=1 bk=a => T(n) є Θ(nlogn)
Quicksort (alg side 59) Må ha en delingsverdi som skiller mellom ”små” og ”store” Går gjennom tabellen fra begge ender. Et ”stort” i nedre del bytter plass med et ”lite” i øvre del Når de to tellerene møtes, har vi fått et delingspunkt som brukes i neste runde av rekursjonen T(n) ≈ 2T(n/2) + cn
Nedre grense for kompleksitet Hvis vi baserer oss på sammenligning av nøkler, kan vi aldri få noe bedre enn Θ(nlogn) Quicksort er den raskeste generelle algoritmen som er funnet Ulempe: Er ikke stabil Flettesortering nesten like rask Ulempe: Bruker ekstra plass
Algoritmer med lavere kompleksitet Kan ikke bygge på sammenligning av nøkler Kan bare brukes på spesielle typer data (for eksempel heltall innenfor et bestemt intervall) Kan bli O(n) Eks: Tellesortering og radikssortering
Tellesortering Bare heltall i intervallet 0 til k Lager en tabell med k+1 elementer Teller opp hvor mange nøkler som er 0, 1, …k Kan deretter beregne posisjonen til ethvert element siden vi vet hvor mange som er mindre enn det.
Radikssortering Baserer seg på at alle nøkler har like mange siffer/tegn Eks postnummer: 3456, 3884, 1958, 3883 Sorterer på ett og ett siffer/tegn bakfra 1.runde: 3883, 3884, 3456, 1958 2.runde: 3456, 1958, 3883, 3884 3.runde: 3456, 3883, 3884, 1958 4.runde: 1958, 3456, 3883, 3884 Forutsetter stabil sortering av hvert siffer
Oppgave Sorter tabellen 45, 13, 23, 17, 56, 84, 61 med Innsettingssortering Flettesortering Quicksort Radikssortering