Un algorithme de tri : le tri par sélection Objectif de l’activité : Concevoir et programmer sur Processing un algorithme de tri : le tri par sélection. Utiliser un algorithme de tri pour un traitement d’image. I) Soyez disciplinés, rangez-vous ! (Trier une main de cartes) Castor aime jouer à un jeu de tri de cartes dont les règles sont les suivantes. Les cartes doivent être posées côte à côte par ordre croissant de gauche à droite en un minimum de déplacements. Un déplacement équivaut à l’échange de deux cartes. Combien de déplacements faut-il effectuer au minimum pour classer les cartes ci-dessous : 2) Voici un algorithme correct pour ranger n et p dans l’ordre croissant : Entrée : saisir n et p entiers naturels Traitement : si n > p alors échanger n et p Sortie : afficher n puis p a) Imaginez que vous possédiez une petite et une grande casserole : la petite casserole contient du chocolat fondu et la grande casserole du beurre fondu. Écrivez, en pseudo-langage, le traitement qui initialise le contenu des casseroles à leur valeur initiale et ensuite réalise la permutation de leurs contenus. b) Écrire une fonction void echange(int [] t,int i, int j) Ecrire l’algorithme permettant de trier un tableau de n éléments (numérotés de 0 à n-1) qui permute les valeurs contenues à l’indice i et à l’indice j du tableau. Partie C : finalisation II) Mettons de l’ordre !!!!! (implémentation de l’algorithme) A l’aide de fonctions précédentes, implémenter et tester la fonction Partie A : à le recherche de JOE Ecrire une fonction int min(int [] tab, int i, int j) qui prend en entrée un tableau d’entiers de taille n et retourne l’indice du minimum de la portion du tableau comprise entre les indices i et j ( 0 i < j n ). Partie B : échangeons les casseroles 1) Apparemment, on peut ranger deux entiers n et p à l’aide de l’algorithme suivant : Entrée : saisir n et p entiers naturels Traitement : si n > p alors affecter à n la valeur p affecter à p la valeur n Sortie : afficher n puis p En sortie, on demande d’afficher successivement les entiers dans l’ordre croissant. Pourquoi cet algorithme est incorrect ? Quel résultat donne-t-il ? int [] tri_selection(int [] t, int n) qui retourne le tableau t, de n valeurs, ordonné dans l’ordre croissant. III) Défi : Le filtre médian permet de supprimer du bruit dans les images. Il est particulièrement utile lorsque ce bruit est de nature « poivre et sel » (c’est-à-dire, lorsque certains pixels sont saturés, avec des valeurs à 0 ou à 255, les autres étant non bruités et restant donc inchangés). Le traitement consiste à calculer, en chaque pixel, la valeur médiane des pixels du voisinage (pour une fenêtre de dimension 3*3, le pixel et ses 8 voisins). Pour trouver la valeur médiane, il faut au préalable ordonner les valeurs des pixels. Image originale Image après passage du filtre Suivant l’avancée de votre travail, vous pourrez approfondir le projet en laissant la possibilité à l’utilisateur de choisir la taille p du filtre (masque p * p). IV) Prolongement possible Comparer les temps d’exécution pour p = 4 puis p = 8 puis p = 16. Un algorithme de tri est assez long en temps d’exécution (le nombre d’opérations à effectuer est important) or lors du déplacement du masque, il faut retrier à chaque fois pour obtenir la médiane. Il est possible améliorer le temps d’exécution en remarquant que le déplacement du filtre 3*3 par exemple revient à retirer 3 valeurs du tableau et à ajouter 3 nouvelles valeurs. 1) Considérons l’algorithme suivant : Entrée : Saisir un tableau tab trié et un entier n Initialisation : Déclarer un tableau t de longueur tab.length – 1. Affecter à u la valeur 0. Traitement : Tant que tab[u]< n Affecter à u la valeur u + 1. Fin Tant_que Pour i allant de u à tab.length – 2 faire Affecter à t[i] la valeur tab [i+1] Fin Pour Pour p allant de 0 à u – 1 Affecter à t[p] la valeur tab[p] Fin Pour Sortie : Afficher t Tester à la main l’algorithme avec tab[– 5 , – 2 , 3 , 7 , 12 , 18 , 20 , 27 , 32] et n = 15. Quel est le rôle de cet algorithme ? 2) Modifier cet algorithme pour supprimer une valeur d’un tableau trié. 3) Implémenter une version optimisée du filtre médian.