03.07.2013 Views

Sorteeralgoritmen - caagt

Sorteeralgoritmen - caagt

Sorteeralgoritmen - caagt

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Sorteeralgoritmen</strong><br />

Zoeken en sorteren met de Java API<br />

Selectionsort<br />

Mergesort<br />

Countingsort<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.1/22


Zoeken en sorteren met<br />

de Java API<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.2/22


<strong>Sorteeralgoritmen</strong><br />

Wat is sorteren?<br />

rangschikken van rij elementen in stijgende<br />

(of dalende) volgorde<br />

Waarom sorteren?<br />

zoeken in gesorteerde rij kan sneller dan in<br />

niet-gesorteerde rij<br />

Θ(log n) i.p.v. Θ(n)<br />

bepalen of een rij dubbels bevat<br />

Θ(n) i.p.v. Θ(n 2 )<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.3/22


Uit de Java API<br />

Klasse java.util.Arrays<br />

bevat ook sorteermethodes en zoekmethodes<br />

Voor primitieve datatypes<br />

static void sort(int[]a)<br />

static void binarySearch(int[]a,int x)<br />

static void sort(int[]a,int van,int tot)<br />

static void binarySearch(int[]a,int<br />

van,int tot,int x)<br />

ook voor double, char, byte, . . .<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.4/22


Voorbeelden<br />

Sorteren en zoeken in rij getallen<br />

int [ ] rij = new int [ ]<br />

{ 2 , 5 , 4 , 3 , 4 , 5 , 7 , 6 , 5 , 9 , 2 , 6 } ;<br />

java . util . Arrays . sort ( rij ) ;<br />

int pos =<br />

java . util . Arrays . binarySearch ( rij , 6 ) ;<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.5/22


Voorbeelden<br />

Sorteren en zoeken in rij getallen<br />

int [ ] rij = new int [ ]<br />

{ 2 , 5 , 4 , 3 , 4 , 5 , 7 , 6 , 5 , 9 , 2 , 6 } ;<br />

java . util . Arrays . sort ( rij ) ;<br />

int pos =<br />

java . util . Arrays . binarySearch ( rij , 6 ) ;<br />

Sorteren van rij strings<br />

String [ ] w = new String [ ]<br />

{ "Appels" ,"appeltaart" ,"Banaan" ,"peer" } ;<br />

java . util . Arrays . sort ( w ) ;<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.6/22


Uit de Java API (2)<br />

Voor objecten<br />

sort(Object[]a)<br />

binarySearch(Object[]a,Object x)<br />

sort(Object[]a,int van,int tot)<br />

binarySearch(Object[]a,int van,int<br />

tot,Object x)<br />

Merk op<br />

objecten worden gesorteerd volgens<br />

“natuurlijke ordening”<br />

gedefinieerd in interface Comparable<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.7/22


Werken met Comparable<br />

De interface Comparable<br />

public interface Comparable {<br />

}<br />

public int compareTo ( T x ) ;<br />

Voorgedefinieerde Comparable types<br />

String, Integer, Double<br />

Byte, Character, Long, Short, Float,<br />

BigInteger, BigDecimal, File, Date<br />

Eigen Comparable types implementeren<br />

(zie cursusnota’s / programma)<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.8/22


Werken met comparatoren<br />

Wanneer?<br />

andere dan “natuurlijke ordening” gewenst<br />

De interface Comparator<br />

public interface Comparator {<br />

}<br />

public int compare ( T x1 , T x2 ) ;<br />

Voorgedefinieerde comparatoren, bvb.<br />

String.CASE_INSENSITIVE_ORDER<br />

Comparatoren implementeren en gebruiken<br />

(zie programma) Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.9/22


Voorbeelden<br />

Sorteren van rij strings<br />

String [ ] w = new String [ ]<br />

{ "Appels" ,"appeltaart" ,"Banaan" ,"peer" } ;<br />

java . util . Arrays . sort ( w ) ;<br />

Sorteren van rij strings met comparator<br />

String [ ] w = new String [ ]<br />

{ "Appels" ,"appeltaart" ,"Banaan" ,"peer" } ;<br />

java . util . Arrays . sort ( w ,<br />

String . CASE_INSENSITIVE_ORDER ) ;<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.10/22


Sorteren door selectie<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.11/22


Sorteren door selectie<br />

Implementatie<br />

void selectionsort ( Comparable [ ] a ) {<br />

for ( int dl=a . length ; dl>1; dl−−) {<br />

}<br />

int imax=0;<br />

for ( int i=1; i


Opmerkingen<br />

algemeen (“generisch”) sorteeralgoritme<br />

ontwerp en implementatie van algoritme<br />

onafhankelijk van type van elementen<br />

enkel ordening van elementen moet<br />

gedefinieerd zijn<br />

Tijdscomplexiteit<br />

T(n) = Θ(n 2 )<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.13/22


Mergesort<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.14/22


Mergesort<br />

Algoritme<br />

Input: een rij elementen (x0,...,xn−1)<br />

Output: deze rij gesorteerd<br />

1: splits te sorteren rij in 2 halve rijen<br />

(x0,...,x ⌊(n−1)/2⌋) en<br />

(x ⌊(n−1)/2⌋+1,...,xn−1)<br />

2: sorteer deelrij (x0,...,x ⌊(n−1)/2⌋)<br />

3: sorteer deelrij (x⌊(n−1)/2⌋+1,...,xn−1)<br />

4: voeg gesorteerde deelrijen samen<br />

(“merge”)<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.15/22


Merge van twee rijen<br />

Algoritme<br />

Input: twee gesorteerde rijen a en b<br />

Output: een gesorteerde rij c met de<br />

elementen van a en b<br />

1: i ← 0; j ← 0; k ← 0<br />

2: while elementen over in a en b do<br />

3: if ai < bj then<br />

4: ck ← ai; i + +; k + +<br />

5: else<br />

6: ck ← bj; j + +; k + +<br />

7: kopieer rest van a resp. b naar c<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.16/22


Complexiteit van mergesort<br />

Recurrente betrekking mergesort<br />

T(n) = 2T(n/2) + f(n)<br />

f(n) is tijd nodig voor merge<br />

Tijdscomplexiteit merge<br />

T ′ (n) = Θ(n)<br />

Uitvoeringstijd mergesort<br />

via master-methode<br />

T(n) = Θ(n log n)<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.17/22


Countingsort<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.18/22


Countingsort<br />

Wanneer te gebruiken?<br />

als sleutels behoren tot vaste, eindige<br />

verzameling<br />

bvb. gehele getallen in [0, 100]<br />

Ideeën om sneller te sorteren<br />

tellen (en bijhouden) hoeveel keer elke<br />

waarde voorkomt<br />

dan is positie van elke waarde te berekenen<br />

in eenmaal overlopen elk element op zijn<br />

positie zetten<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.19/22


Voorbeeld<br />

Te sorteren rij, in [0, 9]<br />

2, 3, 6, 3, 5, 6, 2, 6, 3, 8, 9, 3, 5, 9, 2, 1, 0, 0<br />

Frequentietabel<br />

i 0 1 2 3 4 5 6 7 8 9<br />

#keer 2 1 3 4 0 2 3 0 1 2<br />

Eindposities+1 van waarden in gesorteerde rij<br />

i 0 1 2 3 4 5 6 7 8 9<br />

pos 2 3 6 10 10 12 15 15 16 18<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.20/22


Algoritme<br />

Input: rij (a0,...,an−1) met alle ai ∈ [0,k]<br />

Output: gesorteerde rij (b0,...,bn−1)<br />

for j from 0 to k do<br />

cj ← 0<br />

for i from 0 to n − 1 do<br />

cai<br />

← cai + 1<br />

c0 ← c0 − 1<br />

for j from 1 to k do<br />

cj ← cj + cj−1<br />

for i from n − 1 to 0 do<br />

bca i ← ai<br />

cai<br />

← cai − 1<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.21/22


Complexiteit<br />

Uitvoeringstijd<br />

T(n) = Θ(max(n,k))<br />

Cursus Algoritmen en Datastructuren voor Geomatica (2008–2009) – p.22/22

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!