Sorteeralgoritmen - caagt
Sorteeralgoritmen - caagt
Sorteeralgoritmen - caagt
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