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

reorganized sorting with directories, added 'tri à deux piles', stack and adapted Makefiles

parent 6d69ae93
No related branches found
No related tags found
No related merge requests found
Pipeline #14881 failed
Showing
with 248 additions and 108 deletions
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
...@@ -8,13 +8,6 @@ static void swap(int* a,int* b) { ...@@ -8,13 +8,6 @@ static void swap(int* a,int* b) {
*b = tmp; *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) { void heapsort(int* tab,int size) {
entassement(tab,size); entassement(tab,size);
swap(tab,tab+size-1); swap(tab,tab+size-1);
......
...@@ -14,7 +14,7 @@ int main(int argc, char** argv) { ...@@ -14,7 +14,7 @@ int main(int argc, char** argv) {
case 3: inf = atoi(argv[2]); case 3: inf = atoi(argv[2]);
case 2: size = atoi(argv[1]); 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); rand_init(tab,size,inf,delta);
print(tab,size,"\n=========\n"); print(tab,size,"\n=========\n");
heapsort(tab,size); heapsort(tab,size);
......
#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");
}
}
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
#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;
}
/* 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
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdbool.h> #include <stdbool.h>
#include <assert.h> #include <string.h>
#include "pile_ptr.h"
void print(int size,int tab[size]) { void print(int size,int tab[size]);
for (int i=0;i<size;i++) { void random_tab(int size,int tab[size],int inf,int sup);
printf("%d ",tab[i]); 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;
} }
void random_tab(int size,int tab[size],int inf,int sup) { bool condition(int a,int b,char* op) {
assert(sup > inf); if (strcmp(op,"<") == 0) {
for (int i=0;i<size;i++) { return a < b;
tab[i] = inf+rand()%(sup-inf); } else if (strcmp(op,">=") == 0) {
return a >= b;
} else if (strcmp(op,"") == 0) {
return true;
} else {
return false;
} }
} }
void swap(int* p_a,int* p_b) { void transfert(pile* pile_g,pile* pile_d,int val,char* op) {
int tmp = *p_a; while (!pile_est_vide(*pile_g)
*p_a = *p_b; && condition(pile_sommet(*pile_g),val,op)) {
*p_b = tmp; pile_empiler(pile_d,pile_depiler(pile_g));
}
} }
int partition(int size,int array[size],int first,int last) { void tri_2_pile(int size,int tab[size]) {
int pivot = array[last]; pile pile_g = pile_creer(), pile_d = pile_creer();
int i = first-1,j = last; for (int i=0;i<size;i++) {
do { transfert(&pile_g,&pile_d,tab[i],"<");
do { transfert(&pile_d,&pile_g,tab[i],">=");
i++; pile_empiler(&pile_g,tab[i]);
} while (array[i] < pivot && i<j); }
do { transfert(&pile_d,&pile_g,0,"");
j--; for (int i=0;i<size;i++) {
} while(array[j] > pivot && i<j); tab[i] = pile_depiler(&pile_g);
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) { void print(int size,int tab[size]) {
if (first < last) { for (int i=0;i<size;i++) {
int midpoint = partition(size,array,first,last); printf("%d ",tab[i]);
if (first < midpoint-1) {
quicksort(size,array,first,midpoint-1);
} }
if (midpoint+1 < last) {
quicksort(size,array,midpoint+1,last);
} }
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);
} }
} }
...@@ -62,19 +84,4 @@ void test_ordre(int size,int array[size]) { ...@@ -62,19 +84,4 @@ void test_ordre(int size,int array[size]) {
printf("ok"); 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");
}
}
...@@ -3,7 +3,7 @@ CC:=gcc ...@@ -3,7 +3,7 @@ CC:=gcc
CFLAGS:=-Wall -Wextra -pedantic -g $(SAN) CFLAGS:=-Wall -Wextra -pedantic -g $(SAN)
LDFLAGS:=-lm $(SAN) LDFLAGS:=-lm $(SAN)
all: tris_base_part tris_base quicksort heapsort_main quicksort_part all: tris_base_part tris_base
tris_base_part: tris_base_part.c tris_base_part: tris_base_part.c
$(CC) $(CFLAGS) -o $@ $< $(LDFLAGS) $(CC) $(CFLAGS) -o $@ $< $(LDFLAGS)
...@@ -13,24 +13,8 @@ tris_base: tris_base.c ...@@ -13,24 +13,8 @@ tris_base: tris_base.c
$(CC) $(CFLAGS) -o $@ $< $(LDFLAGS) $(CC) $(CFLAGS) -o $@ $< $(LDFLAGS)
@echo $@ >> .gitignore @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 .PHONY: clean all
clean: clean:
rm -f *.o tris_base tris_base_part quicksort_part quicksort heapsort_main .gitignore rm -f *.o tris_base tris_base_part .gitignore
...@@ -7,7 +7,7 @@ void tri_insertion(int size,int tab[size]); ...@@ -7,7 +7,7 @@ void tri_insertion(int size,int tab[size]);
void tri_bulle(int size,int tab[size]); void tri_bulle(int size,int tab[size]);
void tri_selection(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) { if (argc != 4) {
printf("usage: program <size> <seed> <sorting_algo_number>\n"); printf("usage: program <size> <seed> <sorting_algo_number>\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
...@@ -19,7 +19,6 @@ void main(int argc,char** argv) { ...@@ -19,7 +19,6 @@ void main(int argc,char** argv) {
int res[size]; int res[size];
random_tab(size,res); random_tab(size,res);
print(size,res); print(size,res);
printf("\n");
switch(choix) { switch(choix) {
case 1: tri_bulle(size,res); break; case 1: tri_bulle(size,res); break;
case 2: tri_selection(size,res); break; case 2: tri_selection(size,res); break;
...@@ -27,13 +26,14 @@ void main(int argc,char** argv) { ...@@ -27,13 +26,14 @@ void main(int argc,char** argv) {
default: printf("Choix non available\n"); default: printf("Choix non available\n");
} }
print(size,res); print(size,res);
printf("\n"); return 0;
} }
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]) { void random_tab(int size,int tab[size]) {
......
...@@ -23,7 +23,6 @@ int main(int argc,char** argv) { ...@@ -23,7 +23,6 @@ int main(int argc,char** argv) {
int res[size]; int res[size];
random_tab(size,res); random_tab(size,res);
print(size,res); print(size,res);
printf("\n");
switch(choix) { switch(choix) {
case 1: tri_bulle(size,res); break; case 1: tri_bulle(size,res); break;
case 2: tri_selection(size,res); break; case 2: tri_selection(size,res); break;
...@@ -31,7 +30,6 @@ int main(int argc,char** argv) { ...@@ -31,7 +30,6 @@ int main(int argc,char** argv) {
default: printf("Choix non available\n"); default: printf("Choix non available\n");
} }
print(size,res); print(size,res);
printf("\n");
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
...@@ -102,6 +100,7 @@ void print(int size,int tab[size]) { ...@@ -102,6 +100,7 @@ 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]) { void random_tab(int size,int tab[size]) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment