make
.L’objectif de ce travail pratique est d’implémenter les tris vus en cours et de mesurer leurs performances respectives. En particulier, vous devez écrire les codes en C:
A l’exception du tri cocktail, les (pseudo-)codes de ces tris se trouve dans les slides du cours 7 et du cours 8. Pour le tri cocktail, une bonne description se trouve sur Wikipedia.
La structure de votre code devrait être la suivante:
.
├── cocktail_sort.h
├── cocktail_sort.c
├── merge_sort.h
├── merge_sort.c
├── quick_sort.h
├── quick_sort.c
├── bubble_sort.h
├── bubble_sort.c
├── radix_sort.h
├── radix_sort.c
├── insertion_sort.h
├── insertion_sort.c
├── selection_sort.h
├── selection_sort.c
├── utils.h
├── utils.c
├── sort.c
└── Makefile
Il est impératif de créer un Makefile
,
car la quantité de fichiers à gérer est beaucoup trop grande pour que la
compilation puisse être gérée manuellement.
Le point d’entrée de votre programme doit être contenu dans le
fichier sort.c
. Il doit générer un tableau de taille
N
rempli de valeurs aléatoires et les trier à l’aide d’un
des tris ci-dessus. Finalement, il doit vérifier que le tableau est
correctement trié.
L’utilisation de votre programme devrait être de la forme
./sort <num> <N>
où num
est le numéro correspondant au tri, et
N
est la taille du tableau à trier.
En sortie, votre programme doit afficher le temps qu’il a fallu pour effectuer le tri du tableau (on exclut l’allocation et initialisation du tableau). Pour mesurer le temps d’exécution vous pouvez vous inspirer du cours 7.
Le contenu de la plupart des autres fichiers contiennent les tris à proprement par
Vous remarquez probablement l’existence des fichiers
utils.h
et utils.c
. Ces fichiers doivent
contenir les fonctions utilitaires de votre application
telles que l’affichage d’un tableau, l’initialisation du tableau,
l’échange de valeurs, etc.
Une fois que vous avez implémenté ces fonctionnalités et les tris, vous devrez faire des graphes de performances (le temps d’exécution) de chaque tri en fonction de la taille des tableaux à trier (la taille du tableau sur l’axe horizontal, et le temps d’exécution sur l’axe vertical). Vérifiez que la complexité algorithmique est bien celle prédite dans le cours (en gros soit ça sera N2 soit N ⋅ log2(N)).
Afin de mesurer les performances, utilisez l’option -O3
de gcc
ou clang
pour que le compilateur
optimise votre code au maximum.
Afin de mesurer les performances de façon aussi précise que possible il est recommandé de faire deux choses importantes: