Un algorithme de tri : le tri par sélection 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 l’intervalle [a ; b[ . 1) Ecrire une fonction void aleat(int n) 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 : 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 : 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 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 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 ? 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 ! Considérons l’algorithme suivant : 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 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 1 Affecter à t[i] la valeur tab [i+1] 2) A l’aide de fonctions précédentes, implémenter et tester la fonction Fin Pour int [] tri_selection(int [] t, int n) Pour p allant de 0 à u – 1 qui retourne le tableau t de n valeurs ordonné dans l’ordre croissant. IV) Affecter à t[p] la valeur tab[p] Mini-projet : jouons aux dés !!!!!! Fin Pour Sortie : Afficher t 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. 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.