02.09.2013 Views

Sorteren Sorteren door selectie

Sorteren Sorteren door selectie

Sorteren Sorteren door selectie

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Sorteren</strong><br />

− <strong>Sorteren</strong> van gegevens is een veel voorkomende operatie.<br />

− definitie sorteren : het herschikken van een gegeven verzameling objecten<br />

zodat ze in een specifieke volgorde geplaatst worden.<br />

− Een voorbeeld is een aantal getallen van klein naar groot sorteren.<br />

− Meestal bestaat het object echter uit verschillende delen of velden. Het veld<br />

waarop de sortering gebeurt, wordt sleutel genoemd.<br />

− De verzameling objecten kan in een array zitten: interne sortering, omdat<br />

de gegevens in intern (snel toegankelijk) RAM geheugen zitten.<br />

− Wanneer de verzameling objecten als structures in een bestand zitten,<br />

spreekt men van externe sortering.<br />

− in situ sortering: zuinig omgaan met benodigde geheugenruimte: er wordt<br />

geen tweede array gebruikt om het resultaat in te plaatsen; de elementen<br />

worden in de gegeven array herschikt. worden.<br />

− technieken via array van n integers: (het object bevat alleen de sleutel,<br />

namelijk een geheel getal).<br />

<strong>Sorteren</strong> <strong>door</strong> <strong>selectie</strong><br />

Het principe: kies het element met de kleinste sleutel en wissel dit met het<br />

eerste element. Deze operatie wordt dan herhaald voor de overblijvende n − 1<br />

elementen, dan met n − 2 elementen, enz.<br />

Voorbeeld:<br />

44 55 12 42 94 18 06 67<br />

i = 1 06 55 12 42 94 18 44 67<br />

i = 2 06 12 55 42 94 18 44 67<br />

i = 3 06 12 18 42 94 55 44 67<br />

i = 4 06 12 18 42 94 55 44 67<br />

i = 5 06 12 18 42 44 55 94 67<br />

i = 6 06 12 18 42 44 55 94 67<br />

i = 7 06 12 18 42 44 55 67 94<br />

De functie:<br />

Voor i = 1, 2, 3, . . ., n − 1 doe<br />

{<br />

k is de index van het kleinste element uit {ai, . . .,an};<br />

wissel ai en ak;<br />

}<br />

void s e l e c t i e ( int a [ ] , int n)<br />

{<br />

}<br />

int i , j , k ;<br />

int x ;<br />

for ( i =1; i


<strong>Sorteren</strong> <strong>door</strong> invoegen<br />

Het principe: de objecten zijn verdeeld in een doelreeks a1, . . .,ai−1 en een<br />

bronreeks ai, . . .,an; in opeenvolgende stappen wordt het volgende element ai<br />

van de bronreeks ingevoegd in de doelreeks.<br />

Voorbeeld:<br />

De functie:<br />

44 55 12 42 94 18 06 67<br />

i = 2 44 55 12 42 94 18 06 67<br />

i = 3 12 44 55 42 94 18 06 67<br />

i = 4 12 42 44 55 94 18 06 67<br />

i = 5 12 42 44 55 94 18 06 67<br />

i = 6 12 18 42 44 55 94 06 67<br />

i = 7 06 12 18 42 44 55 94 67<br />

i = 8 06 12 18 42 44 55 67 94<br />

Voor i = 2, 3, . . ., n doe<br />

{<br />

x = ai;<br />

voeg x in op de juiste plaats tussen {a1, . . .,ai};<br />

}<br />

void invoegen ( int a [ ] , int n)<br />

{<br />

int i , j ;<br />

int x ;<br />

for ( i =2; i 0 && x < a [ j ] )<br />

extra test j > 0 wordt overbodig <strong>door</strong> gebruikt te maken van een sentinel,<br />

<strong>door</strong> in a[0] de waarde van x te stoppen. Dit nulde element van de array<br />

bevat toch geen element van de rij die moet gesorteerd worden.<br />

De rij met de te sorteren getallen begint vanaf a[1].<br />

<strong>Sorteren</strong> <strong>door</strong> wisselen<br />

Het principe van bubble sort: vergelijk twee naast elkaar gelegen elementen;<br />

indien ze niet in volgorde staan, wissel dan deze de elementen. Dit wordt<br />

gedaan voor elk paar buren in de rij en het geheel wordt herhaald tot geen<br />

enkel paar buren nog gewisseld wordt.<br />

Voorbeeld:<br />

44 55 12 42 94 18 06 67<br />

i = 2 06 44 55 12 42 94 18 67<br />

i = 3 06 12 44 55 18 42 94 67<br />

i = 4 06 12 18 44 55 42 67 94<br />

i = 5 06 12 18 42 44 55 67 94<br />

i = 6 06 12 18 42 44 55 67 94<br />

i = 7 06 12 18 42 44 55 67 94<br />

i = 8 06 12 18 42 44 55 67 94


De functie:<br />

void bubble( int a [ ] , int n)<br />

{<br />

}<br />

int i , j ;<br />

int x ;<br />

for ( i =2; i=i ; j −−)<br />

{<br />

}<br />

if ( a [ j −1] > a [ j ] )<br />

{<br />

}<br />

x = a [ j −1]; a [ j −1] = a [ j ] ; a [ j ] = x ;<br />

Een verdeel-en-heers techniek<br />

Het principe: verdeel de verzameling objecten in twee delen en sorteer deze<br />

twee delen onafhankelijk van elkaar.<br />

Quicksort ( a, l, r)<br />

{<br />

indien meerdere elementen in {al, . . ., ar}<br />

{<br />

verdeel {al, . . .,ar} in een links en een rechts deel;<br />

(gebruik makend van een pivot element)<br />

Quicksort het linkse deel;<br />

Quicksort het rechtse deel;<br />

}<br />

}<br />

De verdeling moet gebeuren zodat<br />

+ het pivot element ai bevindt zich op zijn uiteindelijke plaats i;<br />

+ al de elementen in {al, . . .,ai−1} zijn kleiner dan of gelijk aan ai;<br />

+ al de elementen in {ai+1, . . .,ar} zijn groter dan of gelijk aan ai.<br />

Voorbeeld:<br />

l<br />

De functie:<br />

(l+r)<br />

2<br />

r<br />

1 4 8 44 55 12 42 94 18 6 67<br />

1 2 3 6 18 12 42 94 55 44 67<br />

1 1 2 6 12 18 42 94 55 44 67<br />

5 6 8 6 12 18 42 94 55 44 67<br />

7 7 8 6 12 18 42 44 55 94 67<br />

6 12 18 42 44 55 67 94<br />

void quicksort ( int a [ ] , int l , int r )<br />

{<br />

int i , j ;<br />

int x , w;<br />

i = l ;<br />

j = r ;<br />

x = a [ ( l+r )/2 ] ;<br />

do<br />

{<br />

while ( a [ i ] < x )<br />

i++ ;<br />

while ( a [ j ] > x )<br />

j−− ;<br />

if ( i


}<br />

}<br />

}<br />

w = a [ i ] ;<br />

a [ i++] = a [ j ] ;<br />

a [ j −−] = w ;<br />

while ( i 1 )<br />

else<br />

n = atoi ( argv [ 1 ] ) ;<br />

n = 10;<br />

srand (1063);<br />

for ( i =1; i


In volgende tabel is de gebruikte rekentijd weergegeven voor een aantal<br />

verschillende n waarden:<br />

n <strong>selectie</strong> invoegen bubble quicksort<br />

128 3 2 3 2<br />

256 8 6 12 3<br />

512 25 17 40 6<br />

1024 85 59 158 14<br />

2048 316 214 580 29<br />

4096 1234 797 2240 59<br />

8192 4828 3122 8890 120<br />

+ quicksort is duidelijk de snelste methode<br />

+ bubblesort (klassiek voorbeeld in veel cursussen) de minst goede methode<br />

Een generieke sorteerfunctie<br />

De functie die de rangorde/volgorde van de elementen die moeten gesorteerd<br />

worden bepaalt, wordt als actueel argument <strong>door</strong>gegeven aan de<br />

sorteerfunctie. In de sorteerfunctie is deze parameter een pointer naar een<br />

functie. Om de gepaste kleiner dan relatie te bepalen, wordt met behulp van<br />

deze pointer de juiste functie opgeroepen.<br />

Deze functie heeft twee parameters, namelijk pointers naar de twee elementen<br />

die met elkaar moeten vergeleken worden. De functie heeft als<br />

terugkeerwaarde:<br />

• -1 : als het eerste element kleiner is dan het tweede element;<br />

• 0 : als het eerste element gelijk is aan het tweede element;<br />

• 1 : als het eerste element groter is dan het tweede element.<br />

Bijvoorbeeld wanneer de twee elementen pointers naar strings zijn, dan kan de<br />

standaard bibliotheekfunctie int strcmp(const char ∗, const char ∗) als functie<br />

gebruikt worden.<br />

/*<br />

* gensort : een generieke sorteerfunctie<br />

*/<br />

#include <br />

#include <br />

#define AANTAL 8260<br />

#define GROOT 65535.0<br />

typedef struct<br />

{<br />

} Blok ;<br />

int x ;<br />

int y ;<br />

void s e l e c t i e ( Blok a [ ] , int b , int n , int (∗ vgl )( Blok ∗ , Blok ∗ ) ) ;<br />

void druk( Blok a [ ] , int n ) ;<br />

int vglx ( Blok ∗s , Blok ∗t ) ;<br />

int vglf ( Blok ∗s , Blok ∗t ) ;<br />

int main( int argc , char ∗argv [ ] )<br />

{<br />

Blok a [AANTAL] ;<br />

int i , n = 10;<br />

if ( argc > 1 )<br />

n = atoi ( argv [ 1 ] ) ;<br />

srand (n ∗1063);<br />

printf (” %d \n” , rand () ) ;<br />

for ( i =1; i


}<br />

s e l e c t i e (a , 1 , n , vglx ) ;<br />

druk(a , n ) ;<br />

s e l e c t i e (a , 1 , n , vglf ) ;<br />

druk(a , n ) ;<br />

int vglx ( Blok ∗s , Blok ∗t )<br />

{<br />

}<br />

if ( s−>x < t−>x )<br />

return −1;<br />

else if ( s−>x > t−>x )<br />

else<br />

return 1;<br />

return 0;<br />

int vglf ( Blok ∗s , Blok ∗t )<br />

{<br />

}<br />

if ( ( float ) s−>x/s−>y < ( float ) t−>x/t−>y )<br />

return −1;<br />

else if ( ( float ) s−>x/s−>y > ( float ) t−>x/t−>y )<br />

else<br />

return 1;<br />

return 0;<br />

void s e l e c t i e ( Blok a [ ] , int b , int n , int (∗ vgl )( Blok ∗ , Blok ∗))<br />

{<br />

int i , j , k ;<br />

Blok x ;<br />

if ( b == n )<br />

return ;<br />

x = a [ b ] ; k = b ;<br />

for ( j=b+1; j

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

Saved successfully!

Ooh no, something went wrong!