Skip to content
Snippets Groups Projects
Commit d75dbab5 authored by paul.albuquer's avatar paul.albuquer
Browse files

little adjustments to quicksort

parent 0a96a074
No related branches found
No related tags found
No related merge requests found
...@@ -4,12 +4,16 @@ ...@@ -4,12 +4,16 @@
#include <assert.h> #include <assert.h>
void print(int size,int tab[size]) { void print(int size,int tab[size]) {
for (int i=0;i<size;i++) printf("%d ",tab[i]); for (int i=0;i<size;i++) {
printf("%d ",tab[i]);
}
} }
void random_tab(int size,int tab[size],int inf,int sup) { void random_tab(int size,int tab[size],int inf,int sup) {
assert(sup > inf); assert(sup > inf);
for (int i=0;i<size;i++) tab[i] = inf+rand()%(sup-inf); for (int i=0;i<size;i++) {
tab[i] = inf+rand()%(sup-inf);
}
} }
void swap(int* p_a,int* p_b) { void swap(int* p_a,int* p_b) {
...@@ -21,16 +25,17 @@ void swap(int* p_a,int* p_b) { ...@@ -21,16 +25,17 @@ void swap(int* p_a,int* p_b) {
int partition(int size,int array[size],int first,int last) { int partition(int size,int array[size],int first,int last) {
int pivot = array[last]; int pivot = array[last];
int i = first-1,j = last; int i = first-1,j = last;
while (true) { do {
do { do {
i++; i++;
} while (array[i] < pivot && i<j); } while (array[i] < pivot && i<j);
do { do {
j--; j--;
} while(array[j] > pivot && i<j); } while(array[j] > pivot && i<j);
if (i >= j) break; if (j>i) {
swap(&array[i],&array[j]); swap(&array[i],&array[j]);
} }
} while (j > i);
swap(&array[i],&array[last]); swap(&array[i],&array[last]);
return i; return i;
} }
...@@ -38,17 +43,22 @@ int partition(int size,int array[size],int first,int last) { ...@@ -38,17 +43,22 @@ int partition(int size,int array[size],int first,int last) {
void quicksort(int size,int array[size],int first,int last) { void quicksort(int size,int array[size],int first,int last) {
if (first < last) { if (first < last) {
int midpoint = partition(size,array,first,last); int midpoint = partition(size,array,first,last);
if (first < midpoint-1) quicksort(size,array,first,midpoint-1); if (first < midpoint-1) {
if (midpoint+1 < last) quicksort(size,array,midpoint+1,last); quicksort(size,array,first,midpoint-1);
}
if (midpoint+1 < last) {
quicksort(size,array,midpoint+1,last);
}
} }
} }
void test_ordre(int size,int array[size]) { void test_ordre(int size,int array[size]) {
for (int i=0;i<size-1;i++) for (int i=0;i<size-1;i++) {
if (array[i] > array[i+1]) { if (array[i] > array[i+1]) {
printf("erreur"); printf("erreur");
return; return;
} }
}
printf("ok"); printf("ok");
} }
......
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdbool.h> #include <stdbool.h>
#include <assert.h>
void print(int size,int tab[size]) { void print(int size,int tab[size]) {
for (int i=0;i<size;i++) { for (int i=0;i<size;i++) {
printf("%d ",tab[i]); printf("%d ",tab[i]);
} }
printf("\n");
} }
void random_tab(int size,int tab[size],int inf,int sup) { void random_tab(int size,int tab[size],int inf,int sup) {
assert(sup > inf);
for (int i=0;i<size;i++) { for (int i=0;i<size;i++) {
tab[i] = inf+rand()%(sup-inf); tab[i] = inf+rand()%(sup-inf);
} }
...@@ -27,14 +26,11 @@ void swap(int* p_a,int* p_b) { ...@@ -27,14 +26,11 @@ void swap(int* p_a,int* p_b) {
int partition(int size,int array[size],int first,int last) { int partition(int size,int array[size],int first,int last) {
int pivot = array[last]; int pivot = array[last];
int i = first-1,j = last; int i = first-1,j = last;
while (true) { do {
// à compléter pour <i>: do {...} while (...); // à compléter pour <i>: do {...} while (...);
// à compléter pour <j>: do {...} while (...); // à compléter pour <j>: do {...} while (...);
if (i >= j) {
break;
}
// à compléter: échanger cases <i> et <j> du tableau <array> // à compléter: échanger cases <i> et <j> du tableau <array>
} } while (j > i);
// à compléter: échanger cases <i> et <last> du tableau <array> // à compléter: échanger cases <i> et <last> du tableau <array>
return i; return i;
} }
...@@ -71,7 +67,6 @@ int main(int argc,char** argv) { ...@@ -71,7 +67,6 @@ int main(int argc,char** argv) {
for (int k=0;k<20;k++) { for (int k=0;k<20;k++) {
random_tab(size,res,0,100); random_tab(size,res,0,100);
print(size,res); print(size,res);
printf("\n");
quicksort(size,res,0,size-1); quicksort(size,res,0,size-1);
print(size,res); print(size,res);
test_ordre(size,res); test_ordre(size,res);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment