Un algorithme de tri : le tri par sélection
Objectif de la séquence :
Concevoir et programmer sur Javascool un algorithme de tri : le tri par sélection.
Utiliser un algorithme de tri pour un petit jeu de dés.
I) Situations problèmes :
Jeu de tri
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 voisines.
Combien de déplacements faut-il effectuer au minimum pour classer les cartes ci-dessous :
Trier des chiffres
Castor trie une série de chiffres à l’aide d’un procédé très particulier. Les trois premières étapes
modifient la série, de cette façon :
Série : 5 , 4 , 7 , 2 , 0 , 3 , 6 , 1
Etape 1 : 4 , 5 , 2 , 0 , 3 , 6 , 1 , 7
Etape 2 : 4 , 2 , 0 , 3 , 5 , 1 , 6 , 7
Etape 3 : 2 , 0 , 3 , 4 , 1 , 5 , 6 , 7
Quelle est la série à l’étape suivante ?
II) Génération aléatoire d’un tableau
Préliminaire :
la fonction prédéfinie random(a,b) donne aléatoirement un entier dans lintervalle [a ; b[ .
1) Ecrire une fonction
void aleat(int n)
qui affiche un tableau de taille n rempli aléatoirement par des entiers compris entre 1 et 6.
2) Ecrire une fonction
int min(int [] tab, int i, int j)
qui retourne le plus petit indice du minimum de la portion du tableau comprise entre les
indices i et j (i < j).
III) Mettons de l’ordre !!!!!
Partie A : é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 ?
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)
qui permute les valeurs contenues à l’indice i et à l’indice j du tableau.
Partie B : soyez disciplinés, rangez-vous !
Principe du tri par sélection sur un tableau de n éléments (numérotés de 0 à n-1) :
On cherche le plus petit élément min du tableau.
On l’échange avec l’élément d’indice 0 du tableau.
On cherche le plus petit élément min de la portion de tableau comprise entre les indices
1 et n 1 .
On l’échange avec l’élément d’indice 1 du tableau.
On recommence de cette façon jusqu’à ce que le tableau soit entièrement trié.
1) Tester la procédure de tri par sélection sur le tableau :
9
4
3
5
7
2
1
2) A l’aide de fonctions précédentes, implémenter et tester la fonction
int [] tri_selection(int [] t, int n)
qui retourne le tableau t de n valeurs ordonné dans l’ordre croissant.
IV) Mini-projet : jouons aux dés !!!!!!
Partie A : Une seule chance !!!
1) A l’aide de la fonction aleat, écrire un algorithme qui permet de tester si le jet donne une suite
d’entiers consécutifs et l’implémenter sur Javascool.
Votre programme devra demander le nombre de dés à lancer et afficher les faces de chaque dé
puis SUITE, ou PAS DE SUITE
Quel est le nombre de dés à lancer ?
Voici le résultat du jet des 5 dés
Dé n°1 : [ 2 ]
Dé n°2 : [ 6 ]
Dé n°3 : [ 4 ]
Dé n°4 : [ 5 ]
Dé n°5 : [ 3 ]
BRAVO : SUITE
Partie B : Et si on recommençait !!!!
1) Version naïve :
Compléter l’algorithme de la partie A pour que le joueur puisse rejouer en choisissant les dés à
relancer.
2) Version optimisée :
On peut remarquer que le joueur ne relancera pas automatiquement tous les dés.
Le jet suivant se traduira donc par l’ajout de nouveaux résultats dans le tableau à la bonne
place et la suppression des anciens ne convenant pas.
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
a) Tester à la main l’algorithme avec tab[ 5 , 2 , 3 , 7 , 12 , 18 , 20 , 27 , 32] et n = 15.
Que fait cet algorithme ?
b) Modifier cet algorithme pour supprimer une valeur d’un tableau trié.
c) Ecrire et implémenter l’algorithme donnant le même résultat que celui du 1) à l’aide de ce qui
précède en évitant de trier à nouveau lors des tours suivants.
Comparer les temps d’exécution avec un nombre total important de dés à lancer lors du
premier jet.
1 / 2 100%