© Anders Broberg, Ulrika Hägglund, Lena Kallin Westin, 2003 Datastrukturer och algoritmer Föreläsning 13 Sortering
Datastrukturer och algoritmer VT 2003 © Anders Broberg, Ulrika Hägglund, Lena Kallin Westin, Innehåll Varför ska man sortera Sortering vs sorterad datatyp Stabilitet Grundprinciper för sortering Genomgång av några sorteringsalgoritmer Hur fort går det att sortera en lista med n tal?
Datastrukturer och algoritmer VT 2003 © Anders Broberg, Ulrika Hägglund, Lena Kallin Westin, Sortering varför? Snabba upp andra algoritmer Sökning Hantera stora datamängder
Datastrukturer och algoritmer VT 2003 © Anders Broberg, Ulrika Hägglund, Lena Kallin Westin, Sortering vs Sorterad datatyp Sortering förändrar ordningen mellan objekten i en struktur efter en sorteringordning (fallande, ökande) Sorterad datatyp De strukturförändrande operationerna i gränsytan (insert, delete) upprätthåller en sorteringsordning mellan de lagrade objekten
Datastrukturer och algoritmer VT 2003 © Anders Broberg, Ulrika Hägglund, Lena Kallin Westin, Saker att beakta Absolut komplexitet Totala komplexiteten i alla implementationssteg oTabell->lista->dubbellänkad lista Passar en viss typ av sortering för en viss typ av implementation Ska man sortera och sedan söka eller osorterad plus linjer sökning
Datastrukturer och algoritmer VT 2003 © Anders Broberg, Ulrika Hägglund, Lena Kallin Westin, Stabilitet Den inbördes relationen mellan två objekt med samma nyckel bibehålls vid sortering [(0,10),(2,3),(5,7),(8,0),(10,7) ] => [(8,0),(2,3),(5,7),(10,7),(0,10)] Alla sorteringsalgoritmer går inte att göra stabila!! Mer om detta senare…
Datastrukturer och algoritmer VT 2003 © Anders Broberg, Ulrika Hägglund, Lena Kallin Westin, Olika grundprinciper Insticks – O(n 2 ) välj ut ett godtyckligt och sätt in det på rätt plats Urvals – O(n 2 ) välj ut det objekt som är på tur och sätt in det sist/först Utbytes – O(n*log(n)) byta plats på objekt som ligger fel inbördes Samsortering – O(n*log(n)) bygger på sammanslagning av redan sorterade strukturer Nyckelsortering – O(m+n)… kräver mer information/kunskap om objektmängden
Datastrukturer och algoritmer VT 2003 © Anders Broberg, Ulrika Hägglund, Lena Kallin Westin, Mer principer… Naiva sorteringar - O(n 2 ) Insticks, urvals, och vissa utbytes ”Smarta” sorteringar - O(nlog(n)) Utbytes och samsorteringar Ännu smartare sorteringar - O(n+m)… Nyckelsorteringar…(nästa föreläsning)
Datastrukturer och algoritmer VT 2003 © Anders Broberg, Ulrika Hägglund, Lena Kallin Westin, Bubbelsortering for i=1 to n-1 do for j=0 to n-1 do if (el[j] > el[j+1] do swap(el[j],el[j+1]) Stabil sortering? Tidskomplexiteten? O(n 2 )för en fältbaserad lista O(?)för en länkad lista?
Datastrukturer och algoritmer VT 2003 © Anders Broberg, Ulrika Hägglund, Lena Kallin Westin, Divide and Conquer Rekursiv algoritm princip Grund idén är att dela upp problemet i mindre och mindre problem Lös dom för basfallet Slå ihop till en totallösning Mergesort och Quicksort är av denna typ Men de jobbar lite annorlunda O(n*log(n))
Datastrukturer och algoritmer VT 2003 © Anders Broberg, Ulrika Hägglund, Lena Kallin Westin, Mergesort Algoritm Sortera sekvensen S Divide: Om S har 2 eller flera element dela S i två lika stora delsekvenser S1 och S2 Recurse: Sortera sekvenserna S1 och S2 rekursivt Conquer: Sätt tillbaka elementen i S genom att slå samman S1 och S2 till en sorterad sekvens
Datastrukturer och algoritmer VT 2003 © Anders Broberg, Ulrika Hägglund, Lena Kallin Westin, Analys av mergesort Mergesortträd Ta ett binärt träd T Varje nod i T representerar ett rekursivt anrop av mergesort Associera insekvensen för varje anrop med varje nod v i T Externa noder i T representerar varje enskilt element i ursprungssekvensen S
Datastrukturer och algoritmer VT 2003 © Anders Broberg, Ulrika Hägglund, Lena Kallin Westin, Exempel… Divide: Om S har 2 eller flera element dela S i två lika stora delsekvenser S1 och S2 Recurse: Sortera sekvenserna S1 och S2 rekursivt Conquer: Sätt tillbaka elementen i S genom att slå samman S1 och S2 till en sorterad sekvens
Datastrukturer och algoritmer VT 2003 © Anders Broberg, Ulrika Hägglund, Lena Kallin Westin, Ihopslagning av två sekvenser Agorithm merge(S1,S2,S) while S1 is not empty and S2 is not empty do if S1.first().element() ≤ S2.first().element() then S.insertLast(S1.remove(S1.first())) else S.insertLast(S2.remove(S2.first while S1 is not empty do S.insertLast(S1.remove(S1.first())) while S2 is not empty do S.insertLast(S2.remove(S2.first()))
Datastrukturer och algoritmer VT 2003 © Anders Broberg, Ulrika Hägglund, Lena Kallin Westin, S S S Exempel på sammanslagning Agorithm merge(S1,S2,S) while S1 is not empty and S2 is not empty do if S1.first().element() ≤ S2.first().element() then S.insertLast(S1.remove(S1.first())) else S.insertLast(S2.remove(S2.first while S1 is not empty do S.insertLast(S1.remove(S1.first())) while S2 is not empty do S.insertLast(S2.remove(S2.first()))
Datastrukturer och algoritmer VT 2003 © Anders Broberg, Ulrika Hägglund, Lena Kallin Westin, Analys av exekveringstiden Höjden på sorteringsträdet kopplat till sorteringen av en sekvens med n element blir log 2 (n) Antag att insättning och borttagning är av O(1) Tiden i varje nod i trädet exkluderat tiden för det rekursiva jobbet nedanför är O(n/2 i ) där i är djupet på noden ligger på, ty storleken på sekvensen är n/2 i Det är exakt 2 i noder på djupet i => totala tiden på djupet i i trädet är O(2 i n/2 i ) vilket är O(n) och höjden på trädet är log(n) Så den totala tidskomplexiteten är O(nlog(n))
Datastrukturer och algoritmer VT 2003 © Anders Broberg, Ulrika Hägglund, Lena Kallin Westin, Quicksort Algoritm Välj ut ett pivoelement Dela upp listan i tre delar Less, Equal, Greater Sortera Less och Greater rekursivt Slå ihop Less+Equal+Greater
Datastrukturer och algoritmer VT 2003 © Anders Broberg, Ulrika Hägglund, Lena Kallin Westin, Quicksort - val av pivoelement O(nlog(n) i bästa fallet Valet av pivoelement kritiskt Vill ha ett pivoelement som ligger i mitten Vid sned fördelning får man insticks/urvals sortering med O(n 2 ) Alternativ (eftersträvar en enkel tilldelning) oVälj första/sista, slumpmässigt oMedel/median mellan några stycken oStörsta av de två första som skiljer sig åt
Datastrukturer och algoritmer VT 2003 © Anders Broberg, Ulrika Hägglund, Lena Kallin Westin, Exempel… Algoritm Välj ut ett pivoelement (det första i listan) Dela upp listan i tre delar Less, Equal, Greater Sortera Less och Greater rekursivt Slå ihop Less+Equal+Greater
Datastrukturer och algoritmer VT 2003 © Anders Broberg, Ulrika Hägglund, Lena Kallin Westin, Analys av Quicksort Lurad….detta är ju lab 3 :-), Men medelfallet ligger nära bästa fallet och värsta fallet inträffar förhoppningsvis inte så ofta…. Slumpa ett pivoelement borde ge bra tidskomplexitet
Datastrukturer och algoritmer VT 2003 © Anders Broberg, Ulrika Hägglund, Lena Kallin Westin, Inplace variant av quicksort Algoritm Traversera parallellt från båda hållen i S, gå bakåt från början av S tills man hittar ett element som är >= PE, traversera från slutet mot början till man hittar ett element som är < PE Skifta plats på dessa två element Upprepa till traverseringarna mötes Skifta in PE på rätt plats Rekursivt anropa på Less och Greater
Datastrukturer och algoritmer VT 2003 © Anders Broberg, Ulrika Hägglund, Lena Kallin Westin, Exempel… LRR
Datastrukturer och algoritmer VT 2003 © Anders Broberg, Ulrika Hägglund, Lena Kallin Westin, Hur snabbt kan man sortera? Jämförelsebaserad sortering Ω(nlog(n)) undre gräns Nyckelsortering snabbare… Nästa föreläsning
Datastrukturer och algoritmer VT 2003 © Anders Broberg, Ulrika Hägglund, Lena Kallin Westin, Ω(nlog(n)) – bevis… Exekveringstiden för en jämförelsebaserad sortering måste vara lika med eller större än djupet på det besluts träd som är associerad med algoritmen Varje nod i detta träd är kopplat till en jämförelse som bestämmer ordning mellan två element i S Därav, varje extern nod i T representerar en unik permutation av elementen i S, och det måste finnas n! noder i T, och höjden är log(n!) Eftersom n! Har åtminstone n/2 termer som är större än eller lika med n/2 => log(n!) = log(n/2)n/2= (n/2)log(n/2) => Ω(nlog(n))