Académique Documents
Professionnel Documents
Culture Documents
LSI 1
LSI 1
Problème de tri
Tri par sélection
Présentation informelle
Exemple d’animation
Algorithme
Réalisation en C
Complexité
Tri par insertion
Présentation informelle
Exemple d’animation
Algorithme
Réalisation en C
Complexité
Tri par sélection vs tri par insertion
Tri : utilisation
3
LSI 1
Le problème de tri
Vue fonctionnelle
Tableau à trier Tableau trié
Grandeur d’entrée Problème de tri Grandeur de sortie
LSI 1
Le problème de tri
• Exigence
▫ Les éléments à trier sont stockés dans un tableau
▫ Les algorithmes de tri exigent que le tri se fasse in-situ, c'est-à-dire il faut que le résultat
soit mémorisé au même endroit que les données initiales
LSI 1
Le problème de tri
• Démarche à suivre pour présenter les algorithmes
▫ Algorithme en Pseudo-code
▫ Réalisation en C
LSI 1
ainsi de suite jusqu’à ce que la suite soit formée d’un seul élément <an>
avec an le maximum de la suite initiale
7
LSI 1
LSI 1
LSI 1
LSI 1
LSI 1
int t;
/*utilisée pour l’échange entre a[i] et a[m]*/
12
LSI 1
LSI 1
LSI 1
LSI 1
LSI 1
LSI 1
LSI 1
LSI 1
LSI 1
LSI 1
LSI 1
• Complexité spatiale
▫ est de l’ordre de n notée O(n)
en effet le tri se fait dans le même tableau
• Complexité temporelle
▫ on identifie l’opération atomique (ou élémentaire) à comptabiliser
on s’intéresse à la boucle interne (while) et plus précisément, on s’intéresse à
l’expression qui gouverne while à savoir ((j>0) && (a[j-1]>v))
on va comptabiliser le nombre de comparaisons a[j-1]>v pour une itération donnée (de la
boucle externe)
le nombre de comparaisons (a[j-1]>v) n’est pas connu a priori, il dépend de la configuration
initiale du tableau a, on distingue les cas suivants
23
LSI 1
• Cas moyen
▫ La complexité du cas moyen est encadrée entre le cas minimum (O(n)) et le cas maximum (O(n2))
▫ Une approximation est O(n2/2)
24
LSI 1
LSI 1
LSI 1
• Complexité temporelle
▫ L’algorithme de tri par sélection ne prend pas en compte la configuration initiale du tableau à trier
Ceci explique Cmin= Cmoy= Cmax Elle est O(n2)
▫ Généralement on compare les algorithmes résolvant le même problème sur la base de la complexité au pire des
cas
Dans le cas pessimiste les deux algorithmes (tri par sélection et tri par insertion) présentent la même complexité O(n2)
27
LSI 1
LSI 1
Un tri est stable s’il préserve l’ordre d’apparition des objets en cas d’égalité des clés.
Cette propriété est utile par exemple lorsqu’on trie successivement sur plusieurs clés
différentes
• Si l’on veut ordonner les étudiants par rapport à leurs noms puis à leurs
moyennes générales, on veut que les étudiants qui ont la même moyenne
apparaissent dans l’ordre lexicographique de leurs noms
29
LSI 1
Tri : Utilisation
Tri par insertion Tri par sélection
void main() void main()
{ {
int a[5]={20,30,40,50,60}; int a[5]={20,30,40,50,60};
int b[5]={60,50,40,30,20}; int b[5]={60,50,40,30,20};
int c[8]={3,8,5,4,12,13,100,12}; int c[8]={3,8,5,4,12,13,100,12};
unsigned i; unsigned i;
tri_insertion(a,5); tri_selection(a,5);
for(i=0;i<5;i++) for(i=0;i<5;i++)
printf("%d\t"; a[i]); printf("%d\t"; a[i]);
printf("\n"); printf("\n");
tri_insertion(b,5); tri_selection(b,5);
for(i=0;i<5;i++) for(i=0;i<5;i++)
printf("%d\t"; b[i]); printf("%d\t"; b[i]);
printf("\n"); printf("\n");
tri_insertion(c,8); Activation Appel tri_selection(c,8);
for(i=0;i<8;i++) ou Invocation for(i=0;i<8;i++)
printf("%d\t"; c[i]); printf("%d\t"; c[i]);
} }
30
LSI 1
Recherche séquentielle
Présentation informelle
Algorithme
Réalisation en C
Complexité
Recherche séquentielle avec sentinelle
Présentation informelle
Réalisation en C
Complexité
Comparaison avec et sans sentinelle
Recherche dichotomique
Présentation informelle
Algorithme
Réalisation en C
Complexité
31
LSI 1
Problème de recherche
Vue fonctionnelle
•Tableau Problème de
Résultat
•x recherche
LSI 1
LSI 1
LSI 1
LSI 1
LSI 1
LSI 1
LSI 1
n-1
n-1
n-1
39
LSI 1
de caractères */
{ unsigned tel[n]; 0 29
char nom[30]; 0
…
0
tel
nom
unsigned tel; . 1
…
1
}; .
struct abonné annuaire_tel[n]; . i i
Matrice de caractères
Gaspillage de
l’espace mémoire
n-1 n-1
n-1
40
LSI 1
LSI 1
LSI 1
LSI 1
LSI 1
• Dans une structure linéaire ici les tableaux on peut placer un espace supplémentaire (une
sentinelle) soit à droite soit à gauche
▫ dans le cas de la recherche on va placer une sentinelle à droite du tableau
45
LSI 1
LSI 1
LSI 1
LSI 1
LSI 1
• On suppose ici que l’on dispose d’un tableau trié par ordre
croissant et qu’on souhaite savoir si un élément fixé (i.e. une
donnée) figure ou non dans la séquence
▫ on peut bien sûr utiliser une recherche séquentielle qui consiste à regarder
successivement, en partant de la gauche du tableau, tous les éléments
LSI 1
Et ainsi de suite jusqu’à ce que la séquence restante soit vide (recherche infructueuse ou
issue négative) ou bien avoir trouvé l’élément cherché (recherche fructueuse ou issue
positive)
L’algorithme de recherche dichotomique applique le principe « diviser pour
résoudre » ou encore « diviser pour régner »
51
LSI 1
LSI 1
LSI 1
LSI 1
• Complexité temporelle
l’opération à comptabiliser est la comparaison strcmp(x, nom[m]) ?
LSI 1
= Cn/2i + i
…
= C1+N = 1+N =1+ log2n On pose n=2N ou N=log2n
avec C1=1 (pour un tableau d’un seul élément)
LSI 1
Recherche dichotomique
• Le gain apporté par l’application de l’algorithme de recherche dichotomique sur un tableau
trié peut être illustré par l’exemple suivant
▫ on souhaite effectuer une recherche sur un tableau trié T de taille N=10000
▫ si on applique
l’algorithme de recherche séquentielle
la complexité dans le cas moyen est 5000