2021-03-14
slides.com/jod/pt_11b
Docent: Jo Devriendt
Assistent: Ann Philips
Coördinator: Joost Vennekens
voornaam.achternaam@kuleuven.be
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Centraal idee:
Verdeel en heers-algoritme
Splits probleem op in deelproblemen, oplossing van globale probleem steunt op oplossing deelproblemen
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
5 3 1 7 2 6 4 5
3 1 2 4 5 5 7 6
5 3 1 7 2 6 4 5
3 1 2 455 7 6
3 1 2 455 6 7
3 1 245567
1 2 345567
12345567
12345567
Legende:
1 2 3 4 5 5 6 7
Noot: we nemen altijd het laatste element uit de te sorteren elementen als pivot
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
https://commons.wikimedia.org/wiki/File:Sorting_quicksort_anim.gif
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
int partition(int a[], int lo, int hi);
void quick(int a[], int lo, int hi);
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
int partition(int a[], int lo, int hi) {
int pivot = a[hi];
int pivotIdx = lo;
for (int j = lo; j < hi; ++j) {
if (a[j] < pivot) {
swap(&a[pivotIdx], &a[j]);
++pivotIdx;
}
}
swap(&a[pivotIdx], &a[hi]);
return pivotIdx;
}
Zet kleinere elementen links
pivot is laatste element
Zet pivot vlak na de kleinere elementen
pivotIdx zal uiteindelijk index van pivot bevatten
void quick(int a[], int lo, int hi) {
if (hi <= lo) {
return;
}
int pivotIdx = partition(a, lo, hi);
quick(a, lo, pivotIdx - 1);
quick(a, pivotIdx + 1, hi);
}
Triviaal geval
Kies pivot, verdeel in links en rechts stuk
Sorteer links en rechts stuk
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
#define N 8
int main() {
int a[N] = {5,3,1,7,2,6,4,5};
quick(a, 0, N - 1);
for (int i = 0; i < N; ++i) {
printf("%d ", a[i]);
}
printf("\n");
}
$ ./a.out
1 2 3 4 5 5 6 7
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
5 3 1 7 2 6 4 5
3 1 2 4 5 5 7 6
5 3 1 7 2 6 4 5
3 1 2 455 7 6
3 1 2 455 6 7
3 1 245567
1 2 345567
12345567
12345567
1 2 3 4 5 5 6 7
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021