init commit
This commit is contained in:
commit
dd25f1dd5e
19 changed files with 1218 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
.idea/
|
7
CMakeLists.txt
Normal file
7
CMakeLists.txt
Normal file
|
@ -0,0 +1,7 @@
|
|||
cmake_minimum_required(VERSION 3.29)
|
||||
project(algo_tri CXX)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 20)
|
||||
|
||||
add_subdirectory(sort_lib)
|
||||
add_subdirectory(src)
|
11
data/fic10
Normal file
11
data/fic10
Normal file
|
@ -0,0 +1,11 @@
|
|||
10
|
||||
2
|
||||
8
|
||||
5
|
||||
6
|
||||
1
|
||||
4
|
||||
7
|
||||
0
|
||||
3
|
||||
9
|
101
data/fic100
Normal file
101
data/fic100
Normal file
|
@ -0,0 +1,101 @@
|
|||
100
|
||||
2
|
||||
60
|
||||
96
|
||||
20
|
||||
19
|
||||
41
|
||||
74
|
||||
55
|
||||
4
|
||||
42
|
||||
35
|
||||
11
|
||||
35
|
||||
93
|
||||
25
|
||||
85
|
||||
87
|
||||
27
|
||||
38
|
||||
55
|
||||
75
|
||||
91
|
||||
98
|
||||
18
|
||||
57
|
||||
14
|
||||
54
|
||||
59
|
||||
41
|
||||
46
|
||||
93
|
||||
71
|
||||
26
|
||||
99
|
||||
8
|
||||
22
|
||||
27
|
||||
21
|
||||
10
|
||||
72
|
||||
25
|
||||
30
|
||||
27
|
||||
44
|
||||
78
|
||||
24
|
||||
83
|
||||
56
|
||||
33
|
||||
26
|
||||
85
|
||||
2
|
||||
84
|
||||
52
|
||||
32
|
||||
16
|
||||
14
|
||||
63
|
||||
57
|
||||
79
|
||||
66
|
||||
10
|
||||
22
|
||||
19
|
||||
70
|
||||
12
|
||||
85
|
||||
65
|
||||
91
|
||||
83
|
||||
39
|
||||
88
|
||||
8
|
||||
51
|
||||
63
|
||||
17
|
||||
93
|
||||
76
|
||||
74
|
||||
38
|
||||
11
|
||||
28
|
||||
24
|
||||
79
|
||||
99
|
||||
11
|
||||
23
|
||||
82
|
||||
35
|
||||
1
|
||||
48
|
||||
68
|
||||
82
|
||||
95
|
||||
99
|
||||
98
|
||||
3
|
||||
24
|
||||
79
|
||||
23
|
4
sort_lib/CMakeLists.txt
Normal file
4
sort_lib/CMakeLists.txt
Normal file
|
@ -0,0 +1,4 @@
|
|||
add_library(sort_lib STATIC
|
||||
data.cpp
|
||||
data.h
|
||||
)
|
207
sort_lib/data.cpp
Normal file
207
sort_lib/data.cpp
Normal file
|
@ -0,0 +1,207 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <malloc.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include "data.h"
|
||||
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* f_lire_data */
|
||||
/* int * f_lire_data(char *fichier, int *n); */
|
||||
/* */
|
||||
/* Créer un tableau [t] contenant les entiers lus dans le fichier texte */
|
||||
/* dans le fichier texte de nom [fichier] */
|
||||
/* */
|
||||
/* Entrées : */
|
||||
/* - [fichier] : nom du fichier texte contenant les données entieres */
|
||||
/* première ligne : nombre [n] d'éléments à lire */
|
||||
/* lignes suivantes : les [n] entiers à lire */
|
||||
/* */
|
||||
/* Modifications : */
|
||||
/* - [n] : nombre entier d'éléments lus */
|
||||
/* */
|
||||
/* Sorties : */
|
||||
/* - [t] : tableau de type int où sont stockés les entiers lus */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
int *f_lire_data(char *fichier, int *n)
|
||||
{
|
||||
int i;
|
||||
FILE *f;
|
||||
int *tab;
|
||||
|
||||
/* Ouverture du fichier en lecture */
|
||||
f = fopen(fichier, "rt");
|
||||
if (f == NULL)
|
||||
{
|
||||
printf("\n\nLecture <f_lire_data> :\nOuverture du fichier %s impossible\n\n", fichier);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
/* Lecture du nombre d'éléments à lire */
|
||||
fscanf (f, "%d\n", n);
|
||||
|
||||
|
||||
/* Allocation de la mémoire nécessaire */
|
||||
tab = (int *) calloc(*n, sizeof(int));
|
||||
|
||||
/* Lecture des n éléments */
|
||||
for (i = 0; i < *n; i++)
|
||||
fscanf (f, "%d\n", &tab[i]);
|
||||
|
||||
fclose(f);
|
||||
return(tab);
|
||||
}
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* f_ecrire_data */
|
||||
/* void f_ecrire_data(char *fichier, int *t, int n) */
|
||||
/* */
|
||||
/* Ecrire les [n] éléments de type entier du tableau [t] dans un fichier de */
|
||||
/* type texte de nom [fichier] */
|
||||
/* première ligne : nombre [n] d'éléments à lire */
|
||||
/* lignes suivantes : les [n] entiers de [t] */
|
||||
/* */
|
||||
/* Entrées : */
|
||||
/* - [fichier] : nom du fichier */
|
||||
/* - [t] : tableau d'entiers */
|
||||
/* - [n] : nombre d'entiers du tableau */
|
||||
/* */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
void f_ecrire_data(char * fichier, int *t, int n)
|
||||
{
|
||||
FILE *f;
|
||||
int i;
|
||||
|
||||
/* Ouverture du fichier en écriture*/
|
||||
f = fopen(fichier, "wt");
|
||||
if (f == NULL)
|
||||
{
|
||||
printf("\n\nEcriture <f_ecrire_data> :\nOuverture du fichier %s impossible\n\n", fichier);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
fprintf(f, "%d\n", n);
|
||||
|
||||
for (i = 0; i < n; i++)
|
||||
fprintf(f, "%d\n", t[i]);
|
||||
|
||||
fclose(f);
|
||||
}
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* ecrire_data */
|
||||
/* void ecrire_data(int *t, int n) */
|
||||
/* */
|
||||
/* Ecrire les [n] éléments de type entier du tableau [t] sur stdout */
|
||||
/* */
|
||||
/* Entrées : */
|
||||
/* - [t] : tableau d'entiers */
|
||||
/* - [n] : nombre d'entiers du tableau */
|
||||
/* */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
void ecrire_data(int *t, int n)
|
||||
{
|
||||
int i;
|
||||
|
||||
printf("\n");
|
||||
for (i = 0; i < n; i++)
|
||||
printf("%d\n", t[i]);
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* data_triee */
|
||||
/* int *data_triee(int n) */
|
||||
/* */
|
||||
/* Créer un tableau [t] contenant les [n] premiers entiers dans l'ordre */
|
||||
/* et sans ex-aequo */
|
||||
/* */
|
||||
/* */
|
||||
/* Entrées : */
|
||||
/* - [n] : nombre d'entiers du tableau à créer */
|
||||
/* */
|
||||
/* Sorties : */
|
||||
/* - [t] : tableau d'entiers */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
int *data_triee(int n)
|
||||
{
|
||||
int i;
|
||||
int *t;
|
||||
|
||||
t = (int *) calloc(n, sizeof(int));
|
||||
|
||||
for (i = 0; i < n; i++)
|
||||
t[i] = i;
|
||||
|
||||
return t;
|
||||
}
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* data_triee_inverse */
|
||||
/* int *data_triee_inverse(int n) */
|
||||
/* */
|
||||
/* Créer un tableau [t] contenant les [n] premiers entiers dans l'ordre */
|
||||
/* inverse et sans ex-aequo */
|
||||
/* */
|
||||
/* */
|
||||
/* Entrées : */
|
||||
/* - [n] : nombre d'entiers du tableau à créer */
|
||||
/* */
|
||||
/* Sorties : */
|
||||
/* - [t] : tableau d'entiers */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
int *data_triee_inverse(int n)
|
||||
{
|
||||
int i;
|
||||
int *t;
|
||||
t = (int *) calloc(n, sizeof(int));
|
||||
|
||||
for (i = 0; i < n; i++)
|
||||
t[n-1-i] = i;
|
||||
|
||||
return t;
|
||||
}
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* random_data */
|
||||
/* int *random_data(int n) */
|
||||
/* */
|
||||
/* Créer un tableau [t] contenant [n] nombres entiers aléatoires */
|
||||
/* */
|
||||
/* */
|
||||
/* Entrées : */
|
||||
/* - [n] : nombre d'entiers du tableau à créer */
|
||||
/* */
|
||||
/* Sorties : */
|
||||
/* - [t] : tableau d'entiers */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
int *random_data(int n)
|
||||
{
|
||||
int i;
|
||||
int pid;
|
||||
int *t;
|
||||
|
||||
pid = getpid ();
|
||||
srand(pid);
|
||||
|
||||
t = (int *) calloc(n, sizeof(int));
|
||||
|
||||
for (i = 0; i < n; i++)
|
||||
t[i] = 1+(int) ((double) n *rand()/(RAND_MAX+1.0));
|
||||
|
||||
return t;
|
||||
}
|
||||
|
125
sort_lib/data.h
Normal file
125
sort_lib/data.h
Normal file
|
@ -0,0 +1,125 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <malloc.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* f_lire_data */
|
||||
/* int * f_lire_data(char *fichier, int *n); */
|
||||
/* */
|
||||
/* Créer un tableau [t] contenant les entiers lus dans le fichier texte */
|
||||
/* dans le fichier texte de nom [fichier] */
|
||||
/* */
|
||||
/* Entrées : */
|
||||
/* - [fichier] : nom du fichier texte contenant les données entieres */
|
||||
/* première ligne : nombre [n] d'éléments à lire */
|
||||
/* lignes suivantes : les [n] entiers à lire */
|
||||
/* */
|
||||
/* Modifications : */
|
||||
/* - [n] : nombre entier d'éléments lus */
|
||||
/* */
|
||||
/* Sorties : */
|
||||
/* - [t] : tableau de type int où sont stockés les entiers lus */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
int * f_lire_data(char *fichier, int *n);
|
||||
|
||||
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* f_ecrire_data */
|
||||
/* void f_ecrire_data(char *fichier, int *t, int n) */
|
||||
/* */
|
||||
/* Ecrire les [n] éléments de type entier du tableau [t] dans un fichier de */
|
||||
/* type texte de nom [fichier] */
|
||||
/* première ligne : nombre [n] d'éléments à lire */
|
||||
/* lignes suivantes : les [n] entiers de [t] */
|
||||
/* */
|
||||
/* Entrées : */
|
||||
/* - [fichier] : nom du fichier */
|
||||
/* - [t] : tableau d'entiers */
|
||||
/* - [n] : nombre d'entiers du tableau */
|
||||
/* */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
void f_ecrire_data(char *fichier, int *t, int n);
|
||||
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* ecrire_data */
|
||||
/* void ecrire_data(int *t, int n) */
|
||||
/* */
|
||||
/* Ecrire les [n] éléments de type entier du tableau [t] sur stdout */
|
||||
/* */
|
||||
/* Entrées : */
|
||||
/* - [t] : tableau d'entiers */
|
||||
/* - [n] : nombre d'entiers du tableau */
|
||||
/* */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
void ecrire_data(int *t, int n);
|
||||
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* data_triee */
|
||||
/* int *data_triee(int n) */
|
||||
/* */
|
||||
/* Créer un tableau [t] contenant les [n] premiers entiers dans l'ordre */
|
||||
/* et sans ex-aequo */
|
||||
/* */
|
||||
/* */
|
||||
/* Entrées : */
|
||||
/* - [n] : nombre d'entiers du tableau à créer */
|
||||
/* */
|
||||
/* Sorties : */
|
||||
/* - [t] : tableau d'entiers */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
int * data_triee(int n);
|
||||
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* data_triee_inverse */
|
||||
/* int *data_triee_inverse(int n) */
|
||||
/* */
|
||||
/* Créer un tableau [t] contenant les [n] premiers entiers dans l'ordre */
|
||||
/* inverse et sans ex-aequo */
|
||||
/* */
|
||||
/* */
|
||||
/* Entrées : */
|
||||
/* - [n] : nombre d'entiers du tableau à créer */
|
||||
/* */
|
||||
/* Sorties : */
|
||||
/* - [t] : tableau d'entiers */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
int * data_triee_inverse(int n);
|
||||
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* random_data */
|
||||
/* int *random_data(int n) */
|
||||
/* */
|
||||
/* Créer un tableau [t] contenant [n] nombres entiers aléatoires */
|
||||
/* */
|
||||
/* */
|
||||
/* Entrées : */
|
||||
/* - [n] : nombre d'entiers du tableau à créer */
|
||||
/* */
|
||||
/* Sorties : */
|
||||
/* - [t] : tableau d'entiers */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
int * random_data(int n);
|
||||
|
||||
|
||||
|
150
sort_lib/tris.c
Normal file
150
sort_lib/tris.c
Normal file
|
@ -0,0 +1,150 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <malloc.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include "tris.h"
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* echanger */
|
||||
/* void echanger(int *t, int n1, int n2) */
|
||||
/* */
|
||||
/* Echanger les éléments d'indice [n1] et [n2] du tableau d'entiers [t] */
|
||||
/* */
|
||||
/* Entrées : */
|
||||
/* - [t] : tableau d'entiers */
|
||||
/* - [n1] : indice */
|
||||
/* - [n2] : indice */
|
||||
/* */
|
||||
/* Modifications : */
|
||||
/* - [t] : tableau d'entiers */
|
||||
/* */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
void echanger(int *t, int n1, int n2)
|
||||
{
|
||||
int inter;
|
||||
|
||||
inter = t[n1];
|
||||
t[n1] = t[n2];
|
||||
t[n2] = inter;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* tri_[algo_tri] */
|
||||
/* void tri_[algo_tri] (int *t, int n, structSondes *complexite) */
|
||||
/* */
|
||||
/* Trier le tableau d'entiers [t] à [n] éléments */
|
||||
/* [algo_tri] : bulle_naif, bulle_bool, bulle_opt, selection, insertion */
|
||||
/* */
|
||||
/* Entrées : */
|
||||
/* - [t] : tableau d'entiers */
|
||||
/* - [n] : nombre d'entiers du tableau */
|
||||
/* */
|
||||
/* Modifications : */
|
||||
/* - [t] : tableau d'entiers */
|
||||
/* */
|
||||
/* Sorties : */
|
||||
/* - [sondes] : structure résultat des sondes sur l'algorithme */
|
||||
/* sondes.nb_comparaisons */
|
||||
/* sondes.nb_echanges */
|
||||
/* sondes.nb_copies */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
structSondes tri_bulle_naif(int *t, int n)
|
||||
{
|
||||
int i, j;
|
||||
structSondes sondes = {0, 0, 0};
|
||||
|
||||
|
||||
return sondes;
|
||||
}
|
||||
|
||||
|
||||
|
||||
structSondes tri_bulle_bool(int *t, int n)
|
||||
{
|
||||
// A faire : utilisation d'un drapeau (booléen) qui teste que les données sont triées
|
||||
// en une lecture des données
|
||||
|
||||
|
||||
structSondes sondes = {0, 0, 0};
|
||||
|
||||
return sondes;
|
||||
}
|
||||
|
||||
|
||||
|
||||
structSondes tri_bulle_opt(int *t, int n)
|
||||
{
|
||||
// A faire : on teste l'endroit du dernier échange pour modifier la boucle principale.
|
||||
// Si le dernier échange est entre t_0 et t_1 alors on a terminé.
|
||||
|
||||
structSondes sondes = {0, 0, 0};
|
||||
|
||||
|
||||
return sondes;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
structSondes tri_selection(int *t, int n)
|
||||
{
|
||||
|
||||
structSondes sondes = {0, 0, 0};
|
||||
|
||||
return sondes;
|
||||
}
|
||||
|
||||
|
||||
|
||||
structSondes tri_insertion(int *t, int n)
|
||||
{
|
||||
|
||||
structSondes sondes = {0, 0, 0};
|
||||
|
||||
return sondes;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* tri_rapide */
|
||||
/* void tri_rapide (int *t, int gauche, int droite, structSondes *complexite)*/
|
||||
/* */
|
||||
/* Trier la portion du tableau d'entiers [t] comprise entre les indices */
|
||||
/* [gauche] et [droite] */
|
||||
/* */
|
||||
/* Entrées : */
|
||||
/* - [t] : tableau d'entiers */
|
||||
/* - [gauche] : indice gauche */
|
||||
/* - [droit] : indice droit */
|
||||
/* */
|
||||
/* Modifications : */
|
||||
/* - [t] : tableau d'entiers */
|
||||
/* */
|
||||
/* Sorties : */
|
||||
/* - [sondes] : structure résultat des sondes sur l'algorithme */
|
||||
/* sondes.nb_comparaisons */
|
||||
/* sondes.nb_echanges */
|
||||
/* sondes.nb_copies */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
structSondes tri_rapide(int *t, int gauche, int droite)
|
||||
{
|
||||
|
||||
|
||||
structSondes sondes = {0, 0, 0};
|
||||
|
||||
return sondes;
|
||||
|
||||
}
|
92
sort_lib/tris.h
Normal file
92
sort_lib/tris.h
Normal file
|
@ -0,0 +1,92 @@
|
|||
|
||||
/* Divers */
|
||||
#define TRUE 1
|
||||
#define FALSE 0
|
||||
|
||||
|
||||
|
||||
/* Eléments d'analyse */
|
||||
typedef struct
|
||||
{
|
||||
long int nb_echanges;
|
||||
long int nb_comparaisons;
|
||||
long int nb_copies;
|
||||
} structSondes;
|
||||
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* echanger */
|
||||
/* void echanger(int *t, int n1, int n2) */
|
||||
/* */
|
||||
/* Echanger les éléments d'indice [n1] et [n2] du tableau d'entiers [t] */
|
||||
/* */
|
||||
/* Entrées : */
|
||||
/* - [t] : tableau d'entiers */
|
||||
/* - [n1] : indice */
|
||||
/* - [n2] : indice */
|
||||
/* */
|
||||
/* Modifications : */
|
||||
/* - [t] : tableau d'entiers */
|
||||
/* */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
void echanger(int *t, int n1, int n2);
|
||||
|
||||
|
||||
/* Algorithmes de tris */
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* tri_[algo_tri] */
|
||||
/* int tri_[algo_tri] (int *t, int n, structSondes *complexite) */
|
||||
/* */
|
||||
/* Trier le tableau d'entiers [t] à [n] éléments */
|
||||
/* [algo_tri] : bulle_naif, bulle_bool, bulle_opt, selection, insertion */
|
||||
/* */
|
||||
/* Entrées : */
|
||||
/* - [t] : tableau d'entiers */
|
||||
/* - [n] : nombre d'entiers du tableau */
|
||||
/* */
|
||||
/* Modifications : */
|
||||
/* - [t] : tableau d'entiers */
|
||||
/* */
|
||||
/* Sorties : */
|
||||
/* - [sondes] : structure résultat des sondes sur l'algorithme */
|
||||
/* complexite->nb_comparaisons */
|
||||
/* complexite->nb_echanges */
|
||||
/* complexite->nb_copies */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
structSondes tri_bulle_naif(int *t, int n);
|
||||
structSondes tri_bulle_bool(int *t, int n);
|
||||
structSondes tri_bulle_opt(int *t, int n);
|
||||
|
||||
structSondes tri_insertion(int *t, int n);
|
||||
structSondes tri_selection(int *t, int n);
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* tri_[algo_tri] */
|
||||
/* int tri_rapide (int *t, int gauche, int droite, structSondes *complexite) */
|
||||
/* */
|
||||
/* Trier la portion du tableau d'entiers [t] comprise entre les indices */
|
||||
/* [gauche] et [droite] */
|
||||
/* */
|
||||
/* Entrées : */
|
||||
/* - [t] : tableau d'entiers */
|
||||
/* - [gauche] : indice gauche */
|
||||
/* - [gauche] : indice droit */
|
||||
/* */
|
||||
/* Modifications : */
|
||||
/* - [t] : tableau d'entiers */
|
||||
/* */
|
||||
/* Sorties : */
|
||||
/* - [sondes] : structure résultat des sondes sur l'algorithme */
|
||||
/* complexite->nb_comparaisons */
|
||||
/* complexite->nb_echanges */
|
||||
/* complexite->nb_copies */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
structSondes tri_rapide(int *t, int gauche, int droite);
|
||||
|
||||
|
348
sort_lib/utilisation.c
Normal file
348
sort_lib/utilisation.c
Normal file
|
@ -0,0 +1,348 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <malloc.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include "tris.h"
|
||||
#include "data.h"
|
||||
|
||||
|
||||
/* Type des données à trier */
|
||||
#define UNKNOWN 0
|
||||
#define FICHIER 1
|
||||
#define RANDOM 2
|
||||
#define TRIE 3
|
||||
#define TRIE_INVERSE 4
|
||||
|
||||
|
||||
/* Type de tri à utiliser */
|
||||
/* Numéro XY, X pour la famille, Y pour la version */
|
||||
#define BULLE_NAIF 11
|
||||
#define BULLE_BOOL 12
|
||||
#define BULLE_OPT 13
|
||||
#define SELECTION 2
|
||||
#define INSERTION 3
|
||||
#define TRIRAPIDE 4
|
||||
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* analyse_complexite */
|
||||
/* void analyse_complexite(complexiteDef *complexite, char * tri) */
|
||||
/* */
|
||||
/* Afficher les différentes options du programme [nom] */
|
||||
/* */
|
||||
/* Entrées : */
|
||||
/* [complexite] : le résultat en terme de complexité du tri */
|
||||
/* [tri] : le nom du tri */
|
||||
/* [n] : le nombre d'éléments triés */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
void analyse_complexite(structSondes sondes, char *tri, int n)
|
||||
{
|
||||
printf("\nAnalyse de la complexite du tri %s de %d entiers\n", tri, n);
|
||||
printf("\t nombre de comparaisons = %ld\n", sondes.nb_comparaisons);
|
||||
printf("\t nombre de copies = %ld\n", sondes.nb_copies);
|
||||
printf("\t nombre d'échanges = %ld\n", sondes.nb_echanges);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* aide */
|
||||
/* int aide(char * nom) */
|
||||
/* */
|
||||
/* Afficher les différentes options du programme [nom] */
|
||||
/* */
|
||||
/* Entrées : */
|
||||
/* [nom] : le nom de l'exécutable */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
void aide(char *nom)
|
||||
{
|
||||
printf("\nUtilisation :\n\n %s [options]\n", nom);
|
||||
|
||||
printf("\nOptions :\n");
|
||||
printf("\n[1] Pour les données (des entiers):\n");
|
||||
printf("\n - lues dans un Fichier texte : -f nom_fichier\n");
|
||||
printf("\n où nom_fichier est le nom d'un fichier texte de la forme\n");
|
||||
printf("\n nombre_elements");
|
||||
printf("\n entier1");
|
||||
printf("\n entier2");
|
||||
printf("\n ...");
|
||||
printf("\n entiern");
|
||||
printf("\n");
|
||||
printf("\n - crées Aléatoirement : -a nombre_elements\n");
|
||||
printf("\n où nombre_elements est le nombre d'éléments du tableau créé\n");
|
||||
printf("\n");
|
||||
printf("\n - déjà triées (Meilleur des Cas) : -mc nombre_elements\n");
|
||||
printf("\n où nombre_elements est le nombre d'éléments du tableau créé\n");
|
||||
printf("\n");
|
||||
printf("\n - triées dans l'ordre inverse (Pire des Cas) : -pc nombre_elements\n");
|
||||
printf("\n où nombre_elements est le nombre d'éléments du tableau créé\n");
|
||||
printf("\n");
|
||||
printf("\n - pour sauver la tableau initial dans un fichier texte : -si nom_fichier\n");
|
||||
printf("\n où nom_fichier est le nom d'un fichier\n");
|
||||
printf("\n");
|
||||
printf("\n - pour sauver la tableau final dans un fichier texte : -sf nom_fichier\n");
|
||||
printf("\n où nom_fichier est le nom d'un fichier\n");
|
||||
printf("\n");
|
||||
printf("\n[2] Pour l'algorithme de Tri :");
|
||||
printf("\n -t algo\n");
|
||||
printf("\n où algo = bulle_naif, bulle_bool, bulle_opt, selection, insertion, rapide\n");
|
||||
printf("\n");
|
||||
printf("\nExemples :\n\n");
|
||||
printf("\n données lues dans le fichier tab1.dat et triées avec bulle naïf");
|
||||
printf("\n -f tab1.dat -t bulle_naif\n");
|
||||
printf("\n -t bulle_naif -f tab1.dat\n\n");
|
||||
printf("\n 10 données créées aléatoirement et triées avec insertion");
|
||||
printf("\n -a 10 -t insertion\n");
|
||||
printf("\n -t insertion -a 10\n\n");
|
||||
printf("\n 8 données dans l'ordre inverse, triées avec tri rapide, sauvées dans tab1.dat");
|
||||
printf("\n -pc 8 -t rapide -sf tab1.dat\n");
|
||||
printf("\n");
|
||||
printf("\n[3] Pour afficher ou non les tableaux : ");
|
||||
printf("\n -v (par défaut on n'affiche pas)\n");
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
int main(int argn, char *argv[])
|
||||
{
|
||||
int type_data;
|
||||
int type_tri;
|
||||
int sauvegarde_tableau_initial;
|
||||
int sauvegarde_tableau_final;
|
||||
int affichage_tableaux;
|
||||
int n = 0;
|
||||
char *fichier_lecture_tableau_initial, *fichier_sauvegarde_tableau_initial, *fichier_sauvegarde_tableau_final;
|
||||
int *tab;
|
||||
int i;
|
||||
|
||||
|
||||
structSondes sondes = {0, 0, 0};
|
||||
|
||||
if (argn == 1)
|
||||
{
|
||||
aide(argv[0]);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
type_data = UNKNOWN;
|
||||
type_tri = UNKNOWN;
|
||||
sauvegarde_tableau_initial = FALSE;
|
||||
sauvegarde_tableau_final = FALSE;
|
||||
affichage_tableaux = FALSE;
|
||||
|
||||
for ( i = 1; i < argn; i+=2 )
|
||||
{
|
||||
// choix des données à trier et des sauvegardes éventuelles du tableau initial et final
|
||||
if (strcmp("-f", argv[i]) == 0)
|
||||
{
|
||||
fichier_lecture_tableau_initial = (char *) malloc(1 + strlen(argv[i+1]) * sizeof(char));
|
||||
strcpy(fichier_lecture_tableau_initial, argv[i+1]);
|
||||
type_data = FICHIER;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (strcmp("-si", argv[i]) == 0)
|
||||
{
|
||||
fichier_sauvegarde_tableau_initial = (char *) malloc(1 + strlen(argv[i+1]) * sizeof(char));
|
||||
strcpy(fichier_sauvegarde_tableau_initial, argv[i+1]);
|
||||
sauvegarde_tableau_initial = TRUE;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (strcmp("-sf", argv[i]) == 0)
|
||||
{
|
||||
fichier_sauvegarde_tableau_final = (char *) malloc(1 + strlen(argv[i+1]) * sizeof(char));
|
||||
strcpy(fichier_sauvegarde_tableau_final, argv[i+1]);
|
||||
sauvegarde_tableau_final = TRUE;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (strcmp("-a", argv[i]) == 0)
|
||||
{
|
||||
n = atoi(argv[i+1]);
|
||||
type_data = RANDOM;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (strcmp("-mc", argv[i]) == 0)
|
||||
{
|
||||
n = atoi(argv[i+1]);
|
||||
type_data = TRIE;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (strcmp("-pc", argv[i]) == 0)
|
||||
{
|
||||
n = atoi(argv[i+1]);
|
||||
type_data = TRIE_INVERSE;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
// choix de l'algorithme de tri
|
||||
if (strcmp("-t", argv[i]) == 0)
|
||||
{
|
||||
if (strcmp("bulle_naif", argv[i+1]) == 0)
|
||||
type_tri = BULLE_NAIF;
|
||||
|
||||
else if (strcmp("bulle_bool", argv[i+1]) == 0)
|
||||
type_tri = BULLE_BOOL;
|
||||
|
||||
else if (strcmp("bulle_opt", argv[i+1]) == 0)
|
||||
type_tri = BULLE_OPT;
|
||||
|
||||
else if (strcmp("selection", argv[i+1]) == 0)
|
||||
type_tri = SELECTION;
|
||||
|
||||
else if (strcmp("insertion", argv[i+1]) == 0)
|
||||
type_tri = INSERTION;
|
||||
|
||||
else if (strcmp("rapide", argv[i+1]) == 0)
|
||||
type_tri = TRIRAPIDE;
|
||||
|
||||
else
|
||||
{
|
||||
printf("\t le tri demandé < %s > n'existe pas \n", argv[i+1]);
|
||||
aide(argv[0]);
|
||||
exit(1);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
// choix de la visualisation (affichage) du tableau initial et final
|
||||
if (strcmp("-v", argv[i]) == 0)
|
||||
{
|
||||
affichage_tableaux = TRUE;
|
||||
i--;
|
||||
continue;
|
||||
}
|
||||
|
||||
printf("\t l'option demandée < %s > n'existe pas \n", argv[i]);
|
||||
aide(argv[0]);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
|
||||
switch(type_data)
|
||||
{
|
||||
case TRIE:
|
||||
{
|
||||
tab = data_triee(n);
|
||||
printf("Tableau initial trié (meilleur des cas)");
|
||||
break;
|
||||
}
|
||||
|
||||
case TRIE_INVERSE:
|
||||
{
|
||||
tab = data_triee_inverse(n);
|
||||
printf("Tableau intial trié en ordre inverse (pire des cas)");
|
||||
break;
|
||||
}
|
||||
case FICHIER:
|
||||
{
|
||||
tab = f_lire_data(fichier_lecture_tableau_initial, &n);
|
||||
printf("Tableau initial lu dans %s", fichier_lecture_tableau_initial);
|
||||
break;
|
||||
}
|
||||
case RANDOM:
|
||||
{
|
||||
tab = random_data(n);
|
||||
printf("Tableau initial aléatoire");
|
||||
break;
|
||||
}
|
||||
case UNKNOWN:
|
||||
aide(argv[0]);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
if (n < 1) {
|
||||
printf("\t le nombre d'éléments à trier est incorrect : %d \n", n);
|
||||
aide(argv[0]);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (sauvegarde_tableau_initial == TRUE)
|
||||
f_ecrire_data(fichier_sauvegarde_tableau_initial, tab, n);
|
||||
|
||||
|
||||
if (affichage_tableaux == TRUE) {
|
||||
printf("\n");
|
||||
ecrire_data(tab, n);
|
||||
}
|
||||
|
||||
switch(type_tri)
|
||||
{
|
||||
case BULLE_NAIF:
|
||||
sondes = tri_bulle_naif(tab, n);
|
||||
if (affichage_tableaux == TRUE) {
|
||||
printf("Tableau trié (bulle naïf)\n");
|
||||
ecrire_data(tab, n);
|
||||
}
|
||||
analyse_complexite(sondes, "bulle naïf", n);
|
||||
break;
|
||||
case BULLE_BOOL:
|
||||
sondes = tri_bulle_bool(tab, n);
|
||||
if (affichage_tableaux == TRUE) {
|
||||
printf("Tableau trié (bulle bool)\n");
|
||||
ecrire_data(tab, n);
|
||||
}
|
||||
analyse_complexite(sondes, "bulle bool", n);
|
||||
break;
|
||||
case BULLE_OPT:
|
||||
sondes = tri_bulle_opt(tab, n);
|
||||
if (affichage_tableaux == TRUE) {
|
||||
printf("Tableau trié (bulle opt)\n");
|
||||
ecrire_data(tab, n);
|
||||
}
|
||||
analyse_complexite(sondes, "bulle opt", n);
|
||||
break;
|
||||
case SELECTION:
|
||||
sondes = tri_selection(tab, n);
|
||||
if (affichage_tableaux == TRUE) {
|
||||
printf("Tableau trié (selection)\n");
|
||||
ecrire_data(tab, n);
|
||||
}
|
||||
analyse_complexite(sondes, "selection", n);
|
||||
break;
|
||||
case INSERTION:
|
||||
sondes = tri_insertion(tab, n);
|
||||
if (affichage_tableaux == TRUE) {
|
||||
printf("Tableau trié (insertion)\n");
|
||||
ecrire_data(tab, n);
|
||||
}
|
||||
analyse_complexite(sondes, "insertion", n);
|
||||
break;
|
||||
case TRIRAPIDE:
|
||||
sondes = tri_rapide(tab, 0, n-1);
|
||||
if (affichage_tableaux == TRUE) {
|
||||
printf("Tableau trié (rapide)\n");
|
||||
ecrire_data(tab, n);
|
||||
}
|
||||
analyse_complexite(sondes, "rapide", n);
|
||||
break;
|
||||
case UNKNOWN:
|
||||
aide(argv[0]);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
if (sauvegarde_tableau_final == TRUE)
|
||||
f_ecrire_data(fichier_sauvegarde_tableau_final, tab, n);
|
||||
|
||||
printf("\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
32
src/AlgoBench.cpp
Normal file
32
src/AlgoBench.cpp
Normal file
|
@ -0,0 +1,32 @@
|
|||
#include "AlgoBench.h"
|
||||
|
||||
BenchResult AlgoBench::bench(std::function<Probes(const std::vector<int>&)> alg_func, int test_depth) {
|
||||
BenchResult results{};
|
||||
|
||||
auto best_data = to_vector(data_triee(test_depth)); // Already sorted
|
||||
auto mid_data = to_vector(random_data(test_depth)); // Random sorted
|
||||
auto worst_data = to_vector(data_triee_inverse(test_depth)); // Sorted inversed
|
||||
|
||||
auto tc = TimeCounter{};
|
||||
|
||||
tc.start();
|
||||
Probes res = alg_func(best_data);
|
||||
tc.stop();
|
||||
results.best_case_time = tc.get_us();
|
||||
results.best_case = res;
|
||||
|
||||
tc.start();
|
||||
res = alg_func(mid_data);
|
||||
tc.stop();
|
||||
results.mid_case_time = tc.get_us();
|
||||
results.mid_case = res;
|
||||
|
||||
tc.start();
|
||||
res = alg_func(worst_data);
|
||||
tc.stop();
|
||||
results.worst_case_time = tc.get_us();
|
||||
results.worst_case = res;
|
||||
|
||||
return results;
|
||||
}
|
||||
|
30
src/AlgoBench.h
Normal file
30
src/AlgoBench.h
Normal file
|
@ -0,0 +1,30 @@
|
|||
#ifndef ALGO_TRI_ALGOBENCH_H
|
||||
#define ALGO_TRI_ALGOBENCH_H
|
||||
|
||||
#include <functional>
|
||||
#include <vector>
|
||||
|
||||
#include "utils.hpp"
|
||||
#include "data.h"
|
||||
#include "TimeCounter.h"
|
||||
|
||||
struct BenchResult {
|
||||
long worst_case_time;
|
||||
long mid_case_time;
|
||||
long best_case_time;
|
||||
|
||||
Probes worst_case;
|
||||
Probes mid_case;
|
||||
Probes best_case;
|
||||
};
|
||||
|
||||
class AlgoBench{
|
||||
public:
|
||||
AlgoBench() = default;
|
||||
~AlgoBench() = default;
|
||||
|
||||
BenchResult bench(std::function<Probes(const std::vector<int>&)> alg_func, int test_depth);
|
||||
};
|
||||
|
||||
|
||||
#endif //ALGO_TRI_ALGOBENCH_H
|
13
src/CMakeLists.txt
Normal file
13
src/CMakeLists.txt
Normal file
|
@ -0,0 +1,13 @@
|
|||
add_executable(sort_utils
|
||||
main.cpp
|
||||
utils.hpp
|
||||
AlgoBench.cpp
|
||||
AlgoBench.h
|
||||
sort_functions.h
|
||||
sort_function.cpp
|
||||
TimeCounter.cpp
|
||||
TimeCounter.h
|
||||
)
|
||||
|
||||
target_link_libraries(sort_utils PUBLIC sort_lib)
|
||||
target_include_directories(sort_utils PUBLIC ${CMAKE_SOURCE_DIR}/sort_lib)
|
15
src/TimeCounter.cpp
Normal file
15
src/TimeCounter.cpp
Normal file
|
@ -0,0 +1,15 @@
|
|||
#include "TimeCounter.h"
|
||||
|
||||
void TimeCounter::start() {
|
||||
m_start = std::chrono::high_resolution_clock::now();
|
||||
}
|
||||
|
||||
void TimeCounter::stop() {
|
||||
m_stop = std::chrono::high_resolution_clock::now();
|
||||
m_duration = std::chrono::duration_cast<std::chrono::microseconds>(m_stop - m_start).count();
|
||||
}
|
||||
|
||||
long TimeCounter::get_us() const {
|
||||
return m_duration;
|
||||
}
|
||||
|
25
src/TimeCounter.h
Normal file
25
src/TimeCounter.h
Normal file
|
@ -0,0 +1,25 @@
|
|||
#ifndef TIMECOUNTER_H
|
||||
#define TIMECOUNTER_H
|
||||
|
||||
#include <chrono>
|
||||
|
||||
class TimeCounter {
|
||||
public:
|
||||
TimeCounter() = default;
|
||||
~TimeCounter() = default;
|
||||
|
||||
void start();
|
||||
void stop();
|
||||
|
||||
long get_us() const;
|
||||
|
||||
private:
|
||||
std::chrono::time_point<std::chrono::high_resolution_clock> m_start;
|
||||
std::chrono::time_point<std::chrono::high_resolution_clock> m_stop;
|
||||
|
||||
long m_duration;
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif //TIMECOUNTER_H
|
5
src/main.cpp
Normal file
5
src/main.cpp
Normal file
|
@ -0,0 +1,5 @@
|
|||
#include <iostream>
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
|
||||
}
|
19
src/sort_function.cpp
Normal file
19
src/sort_function.cpp
Normal file
|
@ -0,0 +1,19 @@
|
|||
#include "AlgoBench.h"
|
||||
|
||||
Probes tri_bulle(const std::vector<int>& data) {
|
||||
Probes probes{0, 0, 0};
|
||||
|
||||
for(int i = data.size(); i <= 0; i--) {
|
||||
for(int j = 0; j < i; j++) {
|
||||
|
||||
if(data[j] > data[j + 1]) {
|
||||
swap(data, i, j);
|
||||
|
||||
probes.nComp++;
|
||||
probes.nSwaps++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return probes;
|
||||
}
|
11
src/sort_functions.h
Normal file
11
src/sort_functions.h
Normal file
|
@ -0,0 +1,11 @@
|
|||
#ifndef ALGO_TRI_SORT_FUNCTIONS_H
|
||||
#define ALGO_TRI_SORT_FUNCTIONS_H
|
||||
|
||||
#include <vector>
|
||||
#include "utils.hpp"
|
||||
|
||||
Probes tri_bulle(const std::vector<int>& data);
|
||||
Probes tri_bulle_flagged(const std::vector<int>& data);
|
||||
Probes tri_bulle_opti(std::vector<int>& data);
|
||||
|
||||
#endif //ALGO_TRI_SORT_FUNCTIONS_H
|
22
src/utils.hpp
Normal file
22
src/utils.hpp
Normal file
|
@ -0,0 +1,22 @@
|
|||
#ifndef ALGO_TRI_UTILS_HPP
|
||||
#define ALGO_TRI_UTILS_HPP
|
||||
|
||||
#include <vector>
|
||||
|
||||
struct Probes {
|
||||
int nComp;
|
||||
int nCopy;
|
||||
int nSwaps;
|
||||
};
|
||||
|
||||
template<class T>
|
||||
std::vector<T> to_vector(T* c_array) {
|
||||
return std::vector<T>(std::begin(c_array), std::end(c_array));
|
||||
}
|
||||
|
||||
template<class T>
|
||||
void swap(const std::vector<T>& src, int a, int b) {
|
||||
std::swap(src.begin() + a, src.begin() + b);
|
||||
}
|
||||
|
||||
#endif //ALGO_TRI_UTILS_HPP
|
Loading…
Reference in a new issue