TD 07 - Tris 2
1 Échauffement
1.1 Exercice 1
On considère un tableau \(T\) de \(n\) entiers (éventuellement avec des répétitions).
Écrire l’algorithme de tri insertion.
Tester votre algorithme sur l’exemple suivant : \(T = [2, 7, 5, 2, 7, 8, 5, 9]\)
Écrire l’algorithme de tri par comptage.
Tester votre algorithme sur l’exemple suivant : \(T = [2, 7, 5, 2, 7, 8, 5, 9]\)
Principe : Insérer chaque élément à sa place dans la partie déjà triée.
Complexité : - Meilleur cas : \(\Theta(n)\) si tableau déjà trié - Pire cas : \(\Theta(n^2)\) si tableau trié en ordre inverse - Moyen cas : \(\Theta(n^2)\)
Stabilité : Stable
Principe : Compter les occurrences de chaque valeur, puis reconstituer le tableau trié.
Complexité : \(\Theta(n + k)\) où \(k\) est l’étendue des valeurs.
Prérequis : Les éléments doivent être des entiers dans un intervalle connu.
Stabilité : Peut être stable selon l’implémentation.
2 Au travail
2.1 Exercice 2 : Sentinelle
Dans le tri par insertion classique, pour insérer chaque élément dans la partie triée à gauche, il faut tester si l’indice bas du tableau est atteint pour éviter d’accéder à une position hors limite (\(j > 1\)).
En plaçant une sentinelle (le minimum du tableau en première position), on garantit qu’on ne sort jamais du tableau : celle-ci arrête naturellement la procédure d’insertion, ce qui simplifie le code et évite un test supplémentaire à chaque étape.
Placement de la sentinelle
Écrire un algorithme qui échange le minimum du tableau avec la première case du tableau.
Insertion avec sentinelle
Compléter votre algorithme pour qu’il opère un tri par insertion, en utilisant la sentinelle pour stopper la boucle interne sans test sur l’indice.
2.2 Exercice 3
Le but de l’exercice est de proposer plusieurs méthodes pour résoudre le problème suivant :
| Problème | Comptage |
| Entrée | un tableau d’entiers de taille \(n\) |
| Sortie | Le nombre d’entiers différents contenus dans le tableau |
Exemple : pour l’instance [2,0,-1,7,0,0,4,2] la sortie attendue est 5.
Proposer un algorithme naïf reposant sur la méthode qui consiste à vérifier pour chaque élément du tableau si celui-ci est présent ailleurs. Quelle est sa complexité ?
Quelle est la complexité d’un tri comparatif optimal ? On suppose maintenant disposer d’un tel algorithme de tri :
TRI.Proposer un nouvel algorithme de résolution du problème de comptage. Quelle est sa complexité ?
On restreint le problème à des tableaux dont les éléments sont des entiers compris entre 1 et 500. Proposer un algorithme encore plus efficace. Quelle est sa complexité ?
Que peut-on modifier dans l’algorithme précédent si les éléments sont des entiers compris entre -249 et 250 ?
- Question 1 : Complexité en \(O(n^2)\) avec deux boucles imbriquées
- Question 2 : Un tri optimal est en \(O(n \log n)\). Après tri, compter les différents est linéaire
- Question 3 : Utiliser un tableau de booléens ou de compteurs indexé par les valeurs
- Question 4 : Décalage d’indice pour gérer les valeurs négatives