Un algorithme de tri : le tri par sélection

publicité
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.
Téléchargement