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