Université de Provence Master1 Mathématiques et applications 2009-2010 Algorithmique et programmation. TD1 1- Deux tris élémentaires On se propose d’étudier deux algorithmes visant à trier par ordre croissant les éléments d’un tableau t d’entiers. Dans tout l’énoncé on notera t[i .. j] la partie du tableau composée des éléments d’indice k, i ≤ k ≤ j. Par convention, cette partie est vide si i > j. Tri par sélection Le tri par sélection consiste à itérer le processus suivant : si t[0 .. (i − 1)] est la partie du tableau déjà triée, chercher l’indice m du minimum de la partie restante t[i..n] et échanger t[i] et t[m]. 1. Exprimer en français structuré cet algorithme, démontrer sa correction et calculer sa complexité en temps. 2. Définir dans la classe T ri selection munie de la variable t correctement déclarée, une méthode min qui prend en entrée un indice i et qui renvoie l’indice du minimum de t[i..n] où n désigne l’indice de la dernière case du tableau t. 3. Définir une méthode echange qui prend en paramètres deux entiers i et j et qui échange le contenu des cases t[i] et t[j]. 4. Définir une méthode tri qui prend en paramètre un tableau d’entiers a, et qui opère sur a le tri par sélection. Elle utilisera bien sûr, les méthodes définies aux 2 questions précédentes. Tri par insertion Le tri par insertion consiste à itérer le processus suivant : si t[0 .. (i − 1)] est la partie du tableau déjà triée, placer à l’endroit correct la valeur t[i] dans la liste t[0..(i − 1)] de façon à ce que t[0..i] soit triée. 1. Exprimer en français structuré cet algorithme. On structurera l’algorithme de telle sorte qu’il fasse appel à un algorithme placer qui prend en entrée un indice i et qui, en supposant que t[0 .. (i − 1)] est triée par ordre croissant, insère correctement la valeur t[i] dans t[0 .. (i − 1)]. On donnera deux version de l’algorithme placer, l’une utilisant notamment la recherche dichotomique. 2. Démontrer sa correction. 3. Calculer sa complexité en temps (pour les deux versions). 4. Définir dans une classe T ri insertion munie de la variable t correctement déclarée, une méthode placer qui prend en entrée un indice i et qui, en supposant que t[0 .. (i − 1)] est triée par ordre croissant, insère correctement la valeur t[i] dans t[0 .. (i − 1)]. 5. Définir dans la classe T ri insertion une méthode tri qui prend en paramètre un tableau d’entiers a, et qui opère sur a le tri par insertion. Programme principal Ecrire une classe T ris, contenant la méthode main, qui opère un tri par sélection ou un tri par insertion sur une liste d’entiers donnés en paramètre du programme et affiche à l’écran la liste une fois triée. 2- Coefficients binômiaux Pour tout couple d’entiers (n,p) tels que 0 ≤ p ≤ n, on note Cnp le nombre de combinaisons à p éléments dans un ensemble à n éléments. Ces nombres Cnp sont aussi appelés coefficients binômiaux car ils interviennent dans la formule du binôme. On rappelle les formules suivantes qui permettent de calculer tout coefficient binômial : ( (F ) Cnn Cnp = 1 et Cn0 = 1 p p−1 pour tout couple (n, p) tel que 1 ≤ p ≤ (n − 1) + Cn−1 = Cn−1 On se propose d’écrire de deux manières différentes un algorithme qui étant donnés deux nombres entiers p et n supposés valides, calcule le nombre Cnp . 1. Donner l’algorithme récursif induit par les formules (F ). 2. On note t(n, p) le nombre d’additions nécessaires au calcul de Cnp par la méthode précédente (les décrémentations d’indices ne seront pas comptées comme additions : seules seront prises en compte les sommes de coefficients binômiaux). Montrer que t(n, p) = Cnp − 1. En déduire, pour un entier n donné, le nombre moyen pour 0 ≤ p ≤ n, d’additions nécessaires au calcul de Cnp . 3. Cet algorithme est-il efficace ? Pouvait-on s’en douter ? Justifier. On peut aussi utiliser les formules (F ) pour donner un algorithme itératif. On emploie pour cela la méthode du triangle de Pascal : c’est une matrice dont les lignes et les colonnes sont numérotées à partir de 0 et dans laquelle Cnp se trouve à l’intersection de la ligne numéro n et de la colonne numéro p. Cette matrice est triangulaire inférieure puisque p ≤ n. De plus toute ligne de la matrice peut-être déduite de la ligne précédente et des formules (F ). 4. Donner les six premières lignes du triangle de Pascal. 5. Donner un algorithme itératif pour calculer Cnp . 6. Evaluer en fonction de n la complexité de l’algorithme en nombre d’additions pour le calcul de Cnp . Que peut-on dire de l’espace occupé par cet algorithme ? 7. Cet algorithme peut-il être considéré comme efficace ? Comparer avec l’algorithme récursif. Pouvait-on se douter du résultat ? Pourquoi ?