Académique Documents
Professionnel Documents
Culture Documents
Guillaume Revy
Exercice 1. Écrire un programme C/C++ qui lit une série d’entiers, les stocke dans un tableau que l’on
agrandit au fur et à mesure, et qui appelle une fonction qui réalise un tri par extraction (tri de base).
Déterminer la complexité.
partie triée
échange
Complexité.
Pour un tableau de taille n, on effectue n parcours de tableau. Pour chaque parcours i, on
effectue n − i traitement(s). On effectue
n(n + 1)
n + (n − 1) + (n − 2) + · · · + 1 = traitements.
2
On a donc une complexité en O(n2 ).
Exercice 2. Écrire un programme C/C++ qui lit une série d’entiers, les stockes dans un tableau que
l’on agrandit au fur et à mesure, et qui appelle un fonction qui réelise un tri par insertion (tri de base).
déterminer la complexité.
partie triée
insertion
Complexité.
Pour un tableau de taille n, quelque soit la méthode d’insertion, on effectue n parcours de
tableau. Pour chaque parcours i, on effectue au plus n − i traitement(s). On effectue
n(n + 1)
n + (n − 1) + (n − 2) + · · · + 1 = traitements.
2
On a donc une complexité en O(n2 ).
Exercice 3. Écrire un programme C/C++ qui lit une série d’entiers, les stocke dans un tableau que l’on
grandit au fur et à mesure, et qui appelle une fonction qui réalise un tri par échange.
8 3 6 2 7 tableau initial
8 3 6 2 7
3 8 6 2 7
3 6 8 2 7
3 6 2 8 7
3 6 2 7 8 tableau à la fin du premier parcours
···
Complexité.
On effectue n − 1 parcours, et pour chaque parcours n − 1 comparaisons. De la même manière
que dans les exercices précédents, on a une complexité en O(n2 ).
– La partie droite du tableau est triée (valeur les plus élevées). Á chaque parcours i, il suffit
d’effectuer n − 1 − i comparaisons.
– Si lors d’un parcours on effectue aucune permutation, le tableau est trié, et on peut arrêter le
tri.
Exercice 4. Écrire le programme C/C++ qui effectue un tri rapide : le QuickSort. Déterminer la
complexité.
1. choisir un élément pivot (on choisira ici la valeur la plus à droite dans le tableau).
2. réorganiser le tableau de telle sorte que toutes les valeurs inférieures au pivot soient à
gauche du pivot, et toutes celles supérieures soient à droite du pivot : le pivot est alors
bien placé dans le tableau.
3. trier les parties non triées à droite et à gauche du pivot par la méthode du QuickSort.
Complexités.
On note T (n) le cout du tri d’un tableau de taille n et c · n le cout de la réorganisation d’un
tableau de taille n de complexité O(n). On a donc
T (n) = c · n + 2 · T (n/2).
T (2p ) = c · 2p + 2 · T (2p−1 )
T (2p−1 ) = c · 2p−1 + 2 · T (2p−2 )
···
T (2) = c · 2 + 2 · T (1),
et donc
T (2p ) = c · (2p + 2 · 2p−1 + · · · + 2p−1 · 2) + 2p · T (1).
| {z }
log2 (n) termes
Finalement, quand
T (n) = c · n · log2 (n) + n · T (1),
et la complexité est alors en O(n · log2 (n)).
#include <time.h>
int main()
{
vector<int> v = random(20,100); affiche(v);
vector<int> v1=v; tri_extraction(v1); affiche(v1);
vector<int> v2=v; tri_echange_insertion(v2); affiche(v2);
vector<int> v3=v; tri_decalage_insertion(v3); affiche(v3);
vector<int> v4=v; tri_par_bulle(v4); affiche(v4);
vector<int> v5=v; tri_par_bulle(v5); affiche(v5);
return 0;
}
// ---------------------------------------
// Tri par extraction
// -> complexite O(n^2)
void tri_extraction(vector<int>& tab)
{
int i, j, min, rang_min;
int i = frontiere;
while( i > 0 && tab[i] < tab[i-1] ){
echange(tab[i],tab[i-1]);
i = i - 1;
}
}
}
// ---------------------------------------
// Tri par decalage et insertion
// -> complexite O(n^2)
void tri_decalage_insertion(vector<int>& tab)
{
int frontiere;
// ---------------------------------------
// Tri par echange simpliste : tri par bulle
// -> complexite O(n^2)
void tri_par_bulle(vector<int>& tab)
{
int i, j;
// Si lors d’un parcours aucune permutation n’est effectuee, le tablea est trie
if( !permut ) break;
}
}
// ---------------------------------------
// Tri rapide
// -> complexite O(n.log(n))
void tri_rapide(vector<int>& tab)
{ quick_sort(tab,0,tab.size()); }
int pivot = tab[d]; // on stocke le pivot (element le plus a droite dans le tableau)
int i = g, j = d-1;
// on reordonne le tableau
while( j > i ){
// on repositionne le pivot
echange(tab[d],tab[j]);