diff --git a/source_codes/sorting/Makefile b/source_codes/sorting/Makefile deleted file mode 100644 index 36389c6b0a77faf226d0f2bb6d08b8329950b35c..0000000000000000000000000000000000000000 --- a/source_codes/sorting/Makefile +++ /dev/null @@ -1,36 +0,0 @@ -CC:=gcc -# SAN:=-fsanitize=address -CFLAGS:=-Wall -Wextra -pedantic -g $(SAN) -LDFLAGS:=-lm $(SAN) - -all: tris_base_part tris_base quicksort heapsort_main quicksort_part - -tris_base_part: tris_base_part.c - $(CC) $(CFLAGS) -o $@ $< $(LDFLAGS) - @echo $@ >> .gitignore - -tris_base: tris_base.c - $(CC) $(CFLAGS) -o $@ $< $(LDFLAGS) - @echo $@ >> .gitignore - -quicksort: quicksort.c - $(CC) $(CFLAGS) -o $@ $< $(LDFLAGS) - @echo $@ >> .gitignore - -quicksort_part: quicksort_part.c - $(CC) $(CFLAGS) -o $@ $< $(LDFLAGS) - @echo $@ >> .gitignore - -heapsort_main: heapsort_main.c heapsort.o - $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) - @echo $@ >> .gitignore - @echo *.o >> .gitignore - - -heapsort.o: heapsort.h - -.PHONY: clean all - -clean: - rm -f *.o tris_base tris_base_part quicksort_part quicksort heapsort_main .gitignore - diff --git a/source_codes/sorting/heapsort/Makefile b/source_codes/sorting/heapsort/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..2dc0918a8e55a128537cd82f6d554379ab0bfbf4 --- /dev/null +++ b/source_codes/sorting/heapsort/Makefile @@ -0,0 +1,19 @@ +CC:=gcc +# SAN:=-fsanitize=address +CFLAGS:=-Wall -Wextra -pedantic -g $(SAN) +LDFLAGS:=-lm $(SAN) + +all: heapsort_main + +heapsort_main: heapsort_main.c heapsort.o + $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) + @echo $@ >> .gitignore + @echo *.o >> .gitignore + +heapsort.o: heapsort.h + +.PHONY: clean all + +clean: + rm -f *.o heapsort_main .gitignore + diff --git a/source_codes/sorting/heapsort.c b/source_codes/sorting/heapsort/heapsort.c similarity index 87% rename from source_codes/sorting/heapsort.c rename to source_codes/sorting/heapsort/heapsort.c index d65e5677ec7767901d25a6701831907f1a870a9b..6531cddef9a43cc65601312ac6ee5c38d942d3ff 100644 --- a/source_codes/sorting/heapsort.c +++ b/source_codes/sorting/heapsort/heapsort.c @@ -8,13 +8,6 @@ static void swap(int* a,int* b) { *b = tmp; } -static void print(int* tab,int size,char* str) { - for (int i=0;i<size;i++) { - printf("%d ",tab[i]); - } - printf("%s",str); -} - void heapsort(int* tab,int size) { entassement(tab,size); swap(tab,tab+size-1); diff --git a/source_codes/sorting/heapsort.h b/source_codes/sorting/heapsort/heapsort.h similarity index 100% rename from source_codes/sorting/heapsort.h rename to source_codes/sorting/heapsort/heapsort.h diff --git a/source_codes/sorting/heapsort_main.c b/source_codes/sorting/heapsort/heapsort_main.c similarity index 89% rename from source_codes/sorting/heapsort_main.c rename to source_codes/sorting/heapsort/heapsort_main.c index a1b8cfcc9eb5a677e72c5533c41b3432a398a1ca..1bf83bc47887ddfa010b8b7fecf2b94d01005ed6 100644 --- a/source_codes/sorting/heapsort_main.c +++ b/source_codes/sorting/heapsort/heapsort_main.c @@ -11,10 +11,10 @@ int main(int argc, char** argv) { int size = 10, inf = 0, delta = 20; switch(argc) { case 4: delta = atoi(argv[3]); - case 3: inf = atoi(argv[2]); + case 3: inf = atoi(argv[2]); case 2: size = atoi(argv[1]); } - int* tab = (int*)malloc(size*sizeof(int)); + int* tab = malloc(size*sizeof(int)); rand_init(tab,size,inf,delta); print(tab,size,"\n=========\n"); heapsort(tab,size); diff --git a/source_codes/sorting/heapsort_part.c b/source_codes/sorting/heapsort/heapsort_part.c similarity index 100% rename from source_codes/sorting/heapsort_part.c rename to source_codes/sorting/heapsort/heapsort_part.c diff --git a/source_codes/sorting/quicksort.c b/source_codes/sorting/quicksort.c deleted file mode 100644 index 7357b69f03b3f91b1d7c4184de751c15da32c229..0000000000000000000000000000000000000000 --- a/source_codes/sorting/quicksort.c +++ /dev/null @@ -1,80 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include <stdbool.h> -#include <assert.h> - -void print(int size,int tab[size]) { - for (int i=0;i<size;i++) { - printf("%d ",tab[i]); - } -} - -void random_tab(int size,int tab[size],int inf,int sup) { - assert(sup > inf); - for (int i=0;i<size;i++) { - tab[i] = inf+rand()%(sup-inf); - } -} - -void swap(int* p_a,int* p_b) { - int tmp = *p_a; - *p_a = *p_b; - *p_b = tmp; -} - -int partition(int size,int array[size],int first,int last) { - int pivot = array[last]; - int i = first-1,j = last; - do { - do { - i++; - } while (array[i] < pivot && i<j); - do { - j--; - } while(array[j] > pivot && i<j); - if (j>i) { - swap(&array[i],&array[j]); - } - } while (j > i); - swap(&array[i],&array[last]); - return i; -} - -void quicksort(int size,int array[size],int first,int last) { - if (first < last) { - int midpoint = partition(size,array,first,last); - if (first < midpoint-1) { - quicksort(size,array,first,midpoint-1); - } - if (midpoint+1 < last) { - quicksort(size,array,midpoint+1,last); - } - } -} - -void test_ordre(int size,int array[size]) { - for (int i=0;i<size-1;i++) { - if (array[i] > array[i+1]) { - printf("erreur"); - return; - } - } - printf("ok"); -} - -int main(int argc,char** argv) { - int size = atoi(argv[1]); - int seed = atoi(argv[2]); - srand(seed); - int* res = malloc(size*sizeof(int)); - for (int k=0;k<20;k++) { - random_tab(size,res,0,100); - print(size,res); - printf("\n"); - quicksort(size,res,0,size-1); - print(size,res); - test_ordre(size,res); - printf("\n================\n"); - } -} - diff --git a/source_codes/sorting/quicksort_part.c b/source_codes/sorting/quicksort_part.c deleted file mode 100644 index 41b4413066536a121e4ac3558611ccad216b2a21..0000000000000000000000000000000000000000 --- a/source_codes/sorting/quicksort_part.c +++ /dev/null @@ -1,94 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include <stdbool.h> - -void print(int size,int tab[size]) { - for (int i=0;i<size;i++) { - printf("%d ",tab[i]); - } - printf("\n"); -} - -void random_tab(int size,int tab[size],int inf,int sup) { - for (int i=0;i<size;i++) { - tab[i] = inf+rand()%(sup-inf); - } -} - -void swap(int* p_a,int* p_b) { - int tmp = *p_a; - *p_a = *p_b; - *p_b = tmp; -} - -// Partition du tableau <array> autour d'une valeur pivot: -// compléter le code -int partition(int size,int array[size],int first,int last) { - int pivot = array[last]; - int i = first-1,j = last; - do { - // à compléter pour <i>: do {...} while (...); - // à compléter pour <j>: do {...} while (...); - // à compléter: échanger cases <i> et <j> du tableau <array> - } while (j > i); - // à compléter: échanger cases <i> et <last> du tableau <array> - return i; -} - -// Tri rapide récursif -void quicksort(int size,int array[size],int first,int last) { - if (first < last) { - int midpoint = partition(size,array,first,last); - if (first < midpoint-1) { - quicksort(size,array,first,midpoint-1); - } - if (midpoint+1 < last) { - quicksort(size,array,midpoint+1,last); - } - } -} - -// Test si le tableau <array> est ordonné croissant -void test_ordre(int size,int array[size]) { - for (int i=0;i<size-1;i++) { - if (array[i] > array[i+1]) { - printf("erreur"); - return; - } - } - printf("ok"); -} - -int main(int argc,char** argv) { - int size = atoi(argv[1]); - int seed = atoi(argv[2]); - srand(seed); - int* res = (int*)malloc(size*sizeof(int)); - for (int k=0;k<20;k++) { - random_tab(size,res,0,100); - print(size,res); - quicksort(size,res,0,size-1); - print(size,res); - test_ordre(size,res); - printf("\n================\n"); - } -} - - - - - - - - - - - - - - - - - - - diff --git a/source_codes/sorting/tri_2_piles/Makefile b/source_codes/sorting/tri_2_piles/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..f4e072c2dcc0212a0222da8c716facf9a05f1ae1 --- /dev/null +++ b/source_codes/sorting/tri_2_piles/Makefile @@ -0,0 +1,24 @@ +CC:=gcc +# SAN:=-fsanitize=address +CFLAGS:=-Wall -Wextra -pedantic -g $(SAN) +LDFLAGS:=-lm $(SAN) + +all: tri_2_piles + +tri_2_piles: tri_2_piles.o pile_ptr.o + $(CC) -D TYPE=int $(CFLAGS) -o $@ $^ $(LDFLAGS) + @echo $@ >> .gitignore + +tri_2_piles.o: tri_2_piles.c + $(CC) -c -D TYPE=int $(CFLAGS) $^ $(LDFLAGS) + @echo *.o >> .gitignore + +pile_ptr.o: pile_ptr.c pile_ptr.h + $(CC) -c -D TYPE=int $(CFLAGS) $^ $(LDFLAGS) + @echo *.o >> .gitignore + +.PHONY: clean all + +clean: + rm -f *.o *.gch tri_2_piles .gitignore + diff --git a/source_codes/sorting/tri_2_piles/pile_ptr.c b/source_codes/sorting/tri_2_piles/pile_ptr.c new file mode 100644 index 0000000000000000000000000000000000000000..d9cf8a0c05cba93984e9a4e56156e9d55a4572c7 --- /dev/null +++ b/source_codes/sorting/tri_2_piles/pile_ptr.c @@ -0,0 +1,60 @@ +#include <stdlib.h> +#include <stdio.h> +#include <stdbool.h> +#include <assert.h> +#include "pile_ptr.h" + + +//Creer une nouvelle pile vide +pile pile_creer() { + return NULL; +} + +//Tester si la pile est vide +bool pile_est_vide(pile stack) { + return (NULL == stack); +} + +//Inserer un élement en début de pile +void pile_empiler(pile* stack,info val) { + element* elmt = malloc(sizeof(element)); + elmt->data = val; + elmt->next = *stack; + *stack = elmt; +} + +//Consulter l'élément au sommet de la pile +info pile_sommet(pile stack) { + assert(!pile_est_vide(stack)); + return stack->data; +} + +//Supprimer un élément de la pile +info pile_depiler(pile* stack) { + info data = pile_sommet(*stack); + element* elmt = *stack; + *stack = (*stack)->next; + free(elmt); + return data; +} + +//Désallouer complètement la pile +void pile_detruire(pile* stack) { + while (!pile_est_vide(*stack)) { + pile_depiler(stack); + } +} + +//Compter le nombre d'éléments de la pile: +int pile_count(pile stack) { + int cnt = 0; + while (NULL != stack) { + stack = stack->next; + cnt++; + } + return cnt; +} + + + + diff --git a/source_codes/sorting/tri_2_piles/pile_ptr.h b/source_codes/sorting/tri_2_piles/pile_ptr.h new file mode 100644 index 0000000000000000000000000000000000000000..507001ee84b7dee2375553f6644e3ebd67eb86ca --- /dev/null +++ b/source_codes/sorting/tri_2_piles/pile_ptr.h @@ -0,0 +1,32 @@ +/* pour éviter que le précompilateur + inclue plusieurs fois le fichier .h */ +#ifndef PILE_PTR_H +#define PILE_PTR_H +#include <stdbool.h> +/* Définir à la compilation de TYPE + p.ex. gcc -c -D TYPE=int pile_ptr.h pile_ptr.c */ +typedef TYPE info; +/* Utilité du typedef : + Element a; <=> struct Element a; */ +typedef struct _element { + info data; + struct _element* next; +} element; +typedef element* pile; + +//Créer d'une nouvelle pile vide +pile pile_creer(); +//Désallouer complètement la pile +void pile_detruire(pile* stack); +//Empiler un élement en début de pile +void pile_empiler(pile* stack,info val); +//Dépiler un élément de la pile +info pile_depiler(pile* stack); +//Consulter l'élément au sommet de la pile +info pile_sommet(pile stack); +//Tester si la pile est vide +bool pile_est_vide(pile stack); +//Compter le nombre d'éléments de la pile: +int pile_count(pile stack); +#endif + diff --git a/source_codes/sorting/tri_2_piles/tri_2_piles.c b/source_codes/sorting/tri_2_piles/tri_2_piles.c new file mode 100644 index 0000000000000000000000000000000000000000..ca7fbb61edc54c8b36968167e98f08aa46c35d99 --- /dev/null +++ b/source_codes/sorting/tri_2_piles/tri_2_piles.c @@ -0,0 +1,87 @@ +#include <stdio.h> +#include <stdlib.h> +#include <stdbool.h> +#include <string.h> +#include "pile_ptr.h" + +void print(int size,int tab[size]); +void random_tab(int size,int tab[size],int inf,int sup); +void test_ordre(int size,int array[size]); + +void tri_2_pile(int size,int tab[size]); + +int main(int argc,char** argv) { + if (2 != argc) { + return 1; + } + int size = atoi(argv[1]); + int seed = atoi(argv[2]); + srand(seed); + int* res = malloc(size*sizeof(int)); + for (int k=0;k<20;k++) { + random_tab(size,res,0,100); + print(size,res); + printf("\n"); + tri_2_pile(size,res); + print(size,res); + test_ordre(size,res); + printf("\n================\n"); + } + return 0; +} + +bool condition(int a,int b,char* op) { + if (strcmp(op,"<") == 0) { + return a < b; + } else if (strcmp(op,">=") == 0) { + return a >= b; + } else if (strcmp(op,"") == 0) { + return true; + } else { + return false; + } +} + +void transfert(pile* pile_g,pile* pile_d,int val,char* op) { + while (!pile_est_vide(*pile_g) + && condition(pile_sommet(*pile_g),val,op)) { + pile_empiler(pile_d,pile_depiler(pile_g)); + } +} + +void tri_2_pile(int size,int tab[size]) { + pile pile_g = pile_creer(), pile_d = pile_creer(); + for (int i=0;i<size;i++) { + transfert(&pile_g,&pile_d,tab[i],"<"); + transfert(&pile_d,&pile_g,tab[i],">="); + pile_empiler(&pile_g,tab[i]); + } + transfert(&pile_d,&pile_g,0,""); + for (int i=0;i<size;i++) { + tab[i] = pile_depiler(&pile_g); + } +} + +void print(int size,int tab[size]) { + for (int i=0;i<size;i++) { + printf("%d ",tab[i]); + } +} + +void random_tab(int size,int tab[size],int inf,int sup) { + for (int i=0;i<size;i++) { + tab[i] = inf+rand()%(sup-inf); + } +} + +void test_ordre(int size,int array[size]) { + for (int i=0;i<size-1;i++) { + if (array[i] > array[i+1]) { + printf("erreur"); + return; + } + } + printf("ok"); +} + + diff --git a/source_codes/sorting/tris_basiques/Makefile b/source_codes/sorting/tris_basiques/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..9a2645067476925d5b01d7b5015ac58f078f8306 --- /dev/null +++ b/source_codes/sorting/tris_basiques/Makefile @@ -0,0 +1,20 @@ +CC:=gcc +# SAN:=-fsanitize=address +CFLAGS:=-Wall -Wextra -pedantic -g $(SAN) +LDFLAGS:=-lm $(SAN) + +all: tris_base_part tris_base + +tris_base_part: tris_base_part.c + $(CC) $(CFLAGS) -o $@ $< $(LDFLAGS) + @echo $@ >> .gitignore + +tris_base: tris_base.c + $(CC) $(CFLAGS) -o $@ $< $(LDFLAGS) + @echo $@ >> .gitignore + +.PHONY: clean all + +clean: + rm -f *.o tris_base tris_base_part .gitignore + diff --git a/source_codes/sorting/tris_base.c b/source_codes/sorting/tris_basiques/tris_base.c similarity index 97% rename from source_codes/sorting/tris_base.c rename to source_codes/sorting/tris_basiques/tris_base.c index dfbd099cc12698438b800a1d5c01582b2aa90591..a47259ce1dab832935c86d8cfac8b6b1e8b2f030 100644 --- a/source_codes/sorting/tris_base.c +++ b/source_codes/sorting/tris_basiques/tris_base.c @@ -7,7 +7,7 @@ void tri_insertion(int size,int tab[size]); void tri_bulle(int size,int tab[size]); void tri_selection(int size,int tab[size]); -void main(int argc,char** argv) { +int main(int argc,char** argv) { if (argc != 4) { printf("usage: program <size> <seed> <sorting_algo_number>\n"); exit(EXIT_FAILURE); @@ -19,7 +19,6 @@ void main(int argc,char** argv) { int res[size]; random_tab(size,res); print(size,res); - printf("\n"); switch(choix) { case 1: tri_bulle(size,res); break; case 2: tri_selection(size,res); break; @@ -27,13 +26,14 @@ void main(int argc,char** argv) { default: printf("Choix non available\n"); } print(size,res); - printf("\n"); + return 0; } void print(int size,int tab[size]) { for (int i=0;i<size;i++) { printf("%d ",tab[i]); } + printf("\n"); } void random_tab(int size,int tab[size]) { diff --git a/source_codes/sorting/tris_base_part.c b/source_codes/sorting/tris_basiques/tris_base_part.c similarity index 99% rename from source_codes/sorting/tris_base_part.c rename to source_codes/sorting/tris_basiques/tris_base_part.c index f41a20e0e43fc8db5bf697160b28ee80c2f4b6b7..09ac5bdd37e63941366b30063e48294e076ce6af 100644 --- a/source_codes/sorting/tris_base_part.c +++ b/source_codes/sorting/tris_basiques/tris_base_part.c @@ -23,7 +23,6 @@ int main(int argc,char** argv) { int res[size]; random_tab(size,res); print(size,res); - printf("\n"); switch(choix) { case 1: tri_bulle(size,res); break; case 2: tri_selection(size,res); break; @@ -31,7 +30,6 @@ int main(int argc,char** argv) { default: printf("Choix non available\n"); } print(size,res); - printf("\n"); return EXIT_SUCCESS; } @@ -102,6 +100,7 @@ void print(int size,int tab[size]) { for (int i=0;i<size;i++) { printf("%d ",tab[i]); } + printf("\n"); } void random_tab(int size,int tab[size]) {