Tableau d'enregistrements



Documents pareils
Complexité. Licence Informatique - Semestre 2 - Algorithmique et Programmation

Recherche dans un tableau

Architecture des Systèmes d Information Architecture des Systèmes d Information

1 de 46. Algorithmique. Trouver et Trier. Florent Hivert. Mél : Florent.Hivert@lri.fr Page personnelle : hivert

Programmation Objet - Cours II

1 Recherche en table par balayage

Cours d Informatique

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

Définitions. Numéro à préciser. (Durée : )

Chap III : Les tableaux

Adama MBODJI MBODJ.SYSTEM

Algorithmes récursifs

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Algorithmique avec Algobox

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Rappels sur les suites - Algorithme


Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

introduction Chapitre 5 Récursivité Exemples mathématiques Fonction factorielle ø est un arbre (vide) Images récursives

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

CORRECTION EXERCICES ALGORITHME 1

Programmation C++ (débutant)/instructions for, while et do...while

Algorithmique et Programmation, IMA

6. Hachage. Accès aux données d'une table avec un temps constant Utilisation d'une fonction pour le calcul d'adresses

Algorithmique et structures de données I

Les différents types de données et leurs opérations de base

4. Les structures de données statiques

Travaux Dirigés n 1 : chaînes de caractères

1. Introduction Création d'une requête...2

Algorithmique avec Algobox

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Feuille TD n 1 Exercices d algorithmique éléments de correction

# let rec concat l1 l2 = match l1 with [] -> l2 x::l 1 -> x::(concat l 1 l2);; val concat : a list -> a list -> a list = <fun>

Projet L1, S2, 2015: Simulation de fourmis, Soutenance la semaine du 4 mai.

Algorithmes de recherche

Utilisation d objets : String et ArrayList

Algorithme. Table des matières

LE PROBLEME DU PLUS COURT CHEMIN

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

I. Introduction aux fonctions : les fonctions standards

Algorithmique, Structures de données et langage C

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Exercices types Algorithmique et simulation numérique Oral Mathématiques et algorithmique Banque PT

Probabilités. Rappel : trois exemples. Exemple 2 : On dispose d un dé truqué. On sait que : p(1) = p(2) =1/6 ; p(3) = 1/3 p(4) = p(5) =1/12

Cours d Algorithmique et de Langage C v 3.0

Cours d initiation à la programmation en C++ Johann Cuenin

Bases de programmation. Cours 5. Structurer les données

STAGE IREM 0- Premiers pas en Python

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Initiation à la programmation en Python

1. Qu'est-ce que SQL? La maintenance des bases de données Les manipulations des bases de données... 5

Cours Informatique Master STEP

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

PROJET ALGORITHMIQUE ET PROGRAMMATION II

Quelques Algorithmes simples

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Manuel d utilisation 26 juin Tâche à effectuer : écrire un algorithme 2

V- Manipulations de nombres en binaire

Organigramme / Algorigramme Dossier élève 1 SI

Initiation à LabView : Les exemples d applications :

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

ARBRES BINAIRES DE RECHERCHE

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

PROBLEMES D'ORDONNANCEMENT AVEC RESSOURCES

Plus petit, plus grand, ranger et comparer

Série TD 3. Exercice 4.1. Exercice 4.2 Cet algorithme est destiné à prédire l'avenir, et il doit être infaillible! Exercice 4.3. Exercice 4.

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

TD3: tableaux avancées, première classe et chaînes

1.6- Génération de nombres aléatoires

Raisonnement par récurrence Suites numériques

Bases de données documentaires et distribuées Cours NFE04

LES TYPES DE DONNÉES DU LANGAGE PASCAL

Plus courts chemins, programmation dynamique

Cours de Programmation Impérative: Zones de mémoires et pointeurs

Traitement de texte : Quelques rappels de quelques notions de base

Partie 1. Fonctions plus complexes dans Excel. Fonctions Si(), Et(), Ou() et fonctions imbriquées. Opérateurs logiques. I.1.

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Université Bordeaux 1, Licence Semestre 3 - Algorithmes et struct...

Correction TD Algorithmique 5.3 Pile Liste 5.3 Pile

Algorithmique et programmation : les bases (VBA) Corrigé

SOMMAIRE... 1 ESPACE DU CLUB...

Plan du cours. Historique du langage Nouveautés de Java 7

Java Licence Professionnelle CISII,

Indications pour une progression au CM1 et au CM2

Exercices de dénombrement

Résolution de systèmes linéaires par des méthodes directes

Sujet proposé par Yves M. LEROY. Cet examen se compose d un exercice et de deux problèmes. Ces trois parties sont indépendantes.

ALGORITHMIQUE ET PROGRAMMATION En C

COURS WINDEV NUMERO 3

Chapitre 2 Devine mon nombre!

Installation et paramétrage. Accès aux modèles, autotextes et clip- art partagés

Algorithmique I. Algorithmique I p.1/??

Publipostage avec Calc

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

ET 24 : Modèle de comportement d un système Boucles de programmation avec Labview.

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Transcription:

Tableau d'enregistrements Regrouper plusieurs enregistrements dans un tableau est parfaitement possible! Exemple : représenter les données concernant 50 personnes algorithme monalgorithme // déclaration d'un enregistrement enregistrement Personne chaine nom; chaine prenom; entier age; réel taille; finenregistrement... Personne[50] t; début // Initialisation t[0].nom <- "Duchmol"; t[0].prenom <- "Robert"; t[0].age <- 24; t[0].taille <- 1.80;... fin 1

Enregistrement de tableaux (1/2) Les champs des enregistrements peuvent être de n'importe quel type, y compris de type tableau! Exemple : on veut représenter pour chaque personne ses diplomes et ses enfants. enum Diplome{LicenceInfo, LicenceMaths,..., MasterInformatique,...}; enregistrement Personne chaine nom; chaine prenom; entier age; réel taille; Diplome[] diplos; Personne[] enfants; finenregistrement; 2

Enregistrement de tableaux (2/2) Exemple : Robert Duchmol a une licence et un master d'informatique et deux enfants, Roberta, 12 ans et 1.50m et Roberto, 15 ans et 1.63m. Personne p,e1,e2; p.nom <- "Duchmol"; p.prenom <- "Robert"; p.age <- 43; p.taille <- 1.80; redim p.diplos[2]; p.diplos[0] <- Diplome.LicenceInfo; p.diplos[1] <- Diplome.MasterInfo; e1.nom <- "Duchmol"; e1.prenom <- "Roberta"; e1.age <- 12; e1.taille <- 1.50; e2.nom <- "Duchmol"; e2.prenom <- "Roberto"; e2.age <- 15; e2.taille <- 1.63; redim p.enfants[2]; p.enfants[0] <- e1; p.enfants[1] <- e2; 3

Tableau d' enregistrements de tableaux t... nom : "Duchmol" prénom : "Robert" âge : 43 taille : 1.80 diplos enfants... LicenceInfo MasterInfo nom : "Duchmol" prénom : "Roberta" âge : 12 taille : 1.50 diplos enfants nom : "Duchmol" prénom : "Roberto" âge : 15 taille : 1.63 diplos enfants Personne[3] t;... // initialisation des données t[1].diplos[0]; // vaut LicenceInfo t[1].enfants[0]; // désigne l'enregistrement concernant Roberta Duchmol t[1].enfants[0].âge; // vaut 12 t[1].enfants[1].enfants; // tableau vide 4

Tableau multidimensionnel (1/2) Les éléments contenus dans un tableau peuvent être de n'importe quel type, y compris de type tableau. Exemple : on veut représenter les étudiants de L1 info en deux groupes. enregistrement Etudiant chaine nom; chaine prenom; entier numéro,age; finenregistrement Etudiant[30] groupe1;... // initialisation de groupe1 Etudiant[28] groupe2;... // initialisation de groupe2 Etudiant[][] l1 <- {groupe1,groupe2}; début écrire l1[0].longueur; // affiche 30 écrire l1[1][27].age; // affiche l'age du 28e étudiant du groupe 2... fin 5

Tableau multidimensionnel (2/2) groupe1 groupe2 l1 Nom : "Tartempion" prénom : "Marcel" âge : 20 numéro : 20453211 Nom : "Tartatin" prénom : "René" âge : 19 numéro : 29453267 Nom : "Tartarin" prénom : "Robert" âge : 18 numéro : 34212345 Nom : "Tartine" prénom : "Natacha" âge : 19 numéro : 20683424............ l1[1][1].age; 6

Déclaration d'un tableau multidimensionnel Déclaration de tableaux multidimensionnels en algorithmique : // tableaux statiques entier[2][3] t; // déclaration d'un tableau d'entiers de dimension 2 réel[5][34][12] toto; // déclaration d'un tableau de réels de dimension 3 // tableaux dynamiques entier[][] t; redim t[2][3]; réel[5][][] toto; redim toto[][34][12]; Déclaration de tableaux multidimensionnels en Java : int[][] t; t = new int[2][3]; float[][][] toto = new float[5][34][12]; char[][4] truc; truc = new char[7][]; 7

Initialisation d'un tableau multidimensionnel Initialisation d'un tableau multidimensionnel par énumération : algorithme JeuDeMorpion1 chaine[][] morpion <- {{"","",""},{"","",""},{"","",""}}; début... morpion[1][1] <- "croix"; morpion[2][2] <- "rond";... fin Initialisation d'un tableau multidimensionnel par boucles imbriquées : algorithme JeuDeMorpion2 chaine[3][3] morpion; entier i,j; début pour (i allant de 0 à morpion.longueur pas 1) faire pour (j allant de 0 à morpion[i].longueur pas 1) faire morpion[i][j] <- ""; finpour finpour... fin 8

Initialisation d'un tableau multidimensionnel Attention : les tableaux initialisés par énumération ne contiennent pas forcément des tableaux de la même taille. caractères[][] phrase <- {{'b','o','n','j','o','u','r'}, {'l','e'}, {'m','o','n','d','e'}}; phrase 'b' 'o' 'l' 'e' 'm' 'o' 'n' 'n' écrire phrase[1][3]; entier i,j; pour (i allant de 0 à phrase.longueur pas 1) faire pour (j allant de 0 à phrase[i].longueur pas 1) faire écrire phrase[i][j]; finpour finpour 'j' 'o' 'u' 'r' 'd' 'e' 9

Tableau de dimension supérieure à 2 Exemple : dans un logiciel d'infographie, on veut représenter des images organisées en calques. enum Couleur {rouge, gris, bleu, kaki, violet, bleu_clair,...}; Couleur[3][16][16] image; image[0][0][0] <- Couleur.bleu_clair; image[0][1][0] <- Couleur.gris;... 10

Structuration des données Il ne faut pas hésiter à structurer les données au maximum en définissant des enregistrements et des tableaux et en les combinant car cela : - facilite l'écriture des algorithmes et des programmes - permet de passer des paramètres complexes aux fonctions - permet de faire retourner par les fonctions des valeurs multiples Exemple : écrire une fonction qui prend en paramètres toutes les données concernant des personnes et renvoie les noms des personnes majeures. fonction avec retour chaine[] majeures(personne[] t)... Problème : dans les structures de données, retrouver une valeur nécessite de parcourir la structure. Il faut trouver des méthodes pour réaliser ces recherches efficacement. 11

Recherche dans un tableau Première idée : recherche par parcours séquentiel. On parcourt le tableau case par case jusqu'à ce qu'on trouve l'élément. Exemple : recherche séquentielle dans un tableau de chaines. // cette fonction renvoie vrai si x est présente dans tab, faux sinon fonction avec retour booléen rechercheelement1(chaine[] tab, chaine e) entier i; booléen trouve; début i <- 0; trouve <- faux; tantque (i < tab.longueur et non trouve) faire si (tab[i] = e) alors trouve <- vrai; sinon i <- i + 1; finsi fintantque retourne trouve; fin 12

Recherche dans un tableau multidimensionnel // cette fonction renvoie vrai si x est présente dans tab, faux sinon fonction avec retour booléen rechercheelement2(chaine[][] tab, chaine e) entier i,j; booléen trouve; Début trouve <- faux; i <- 0; tantque (i < tab.longueur et non trouve) faire j <- 0; tantque (j < tab[i].longueur et non trouve) faire si (tab[i][j] = e) alors trouve <- vrai; sinon j <- j + 1; finsi fintantque i <- i + 1; fintantque retourne trouve; fin 13

Recherche des occurences Si on veut trouver le nombre d'occurences de la valeur recherchée, il faut parcourir toute la structure et ne pas s'arrêter dès qu'on trouve la valeur. // cette fonction renvoie le nombre de fois où x est présente dans tab fonction avec retour entier rechercheelement3(chaine[] tab, chaine e) entier i, nboc; début i <- 0; nboc <- 0; tantque (i < tab.longueur) faire si (tab[i] == e) alors nboc <- nboc + 1; finsi i <- i + 1; fintantque retourne nboc; fin 14

Recherche dans un tableau trié (1/2) Si le tableau est trié par ordre croissant (respectivement décroissant), on peut s'arrêter dès que la valeur rencontrée est plus grande (respectivement plus petit) que la valeur cherchée. Exemple : chercher le caractère 'l' dans le tableau suivant 'a' 'c' 'c' 'd' 'f' 'm' 'n' 'p' 'v' 'x' Remarque : cette optimisation n'est efficace que si on rencontre «assez vite» un élément plus grand que celui recherché. 15

Recherche dans un tableau trié (2/2) // cette fonction renvoie vrai si x est présente dans tab, faux sinon // le tableau tab est supposé trié par ordre croissant fonction avec retour booléen rechercheelement4(chaine[] tab, chaine e) entier i; booléen trouve,possible; début i <- 0; trouve <- faux; possible <- vrai; tantque (i < tab.longueur et possible et non trouve) faire si (tab[i] = e) alors trouve <- vrai; sinon si (tab[i] > x) alors possible <- faux; sinon i <- i + 1; finsi finsi fintantque retourne trouve; fin 16

Recherche dichotomique (1/4) Principe divide ut imperes (diviser pour régner) : on découpe les données en différentes parties qu'on traite séparément. Exemple : pour rechercher un élément dans un tableau, on le coupe en deux et on chercher dans chaque partie. 'a' 'c' 'c' 'd' 'f' 'm' 'n' 'p' 'v' 'x' 'a' 'c' 'c' 'd' 'f' 'm' 'n' 'p' 'v' 'x' Premier cas où ce principe est utile : si on peut lancer des programmes en parallèle, on mettra environ deux fois moins de temps pour rechercher l'élément. Deuxième cas où ce principe est utile : si le tableau est trié, on peut ne chercher l'élément que dans une seule des parties. 17

Recherche dichotomique (2/4) Principe de la recherche par dichotomie : supposons que le tableau est trié par ordre croissant. On regarde l'élément situé au milieu du tableau : 1- s'il s'agit de l'élément recherché, c'est gagné. 2- s'il est plus grand que l'élément recherché, on cherche dans la moitié gauche 3- s'il est plus petit que l'élément recherché, on cherche dans la moitié droite Exemple : rechercher 490 dans le tableau d'entiers suivant. 4 17 25 26 45 45 87 102 234 237 490 1213 5681 5690 7012 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 18

Recherche dichotomique (3/4) On doit savoir à chaque itération sur quel intervalle d'indices on travaille. Ici, on cherche l'élément entre les indice i et j. On s'arrête quand l'intervalle de recherche est vide. // cette fonction renvoie vrai si x est présente dans tab, faux sinon // le tableau tab est supposé trié par ordre croissant fonction avec retour booléen rechercheelement3(chaine[] tab, chaine e) entier i, j; booléen trouve; début trouve <- false; i <- 0; j <- tab.longueur-1; tantque (i <= j et non trouve) faire si (tab[(j+i)/2] = e) alors trouve <- vrai; sinon si (tab[(j+i)/2] > x) alors j <- (j+i)/2-1; sinon i <- (j+i)/2 + 1; finsi finsi fintantque retourne trouve; fin 19

Recherche dichotomique (4/4) Exemple : rechercher 490 dans le tableau d'entiers suivant. 4 17 25 26 45 45 87 102 234 237 523 1213 5681 5690 7012 0i 1 2 3 4 5 6 7 8 i 9j 10 i=j ji 11 12 13 14 j Le principe de dichotomie peut être utilisé dès qu'on a un intérêt à découper en deux un espace de recherche. Exemple : le jeu «plus grand, plus petit». Il s'agit de trouver un nombre choisi entre 0 et 100. pg [76,100] : 88?... [51,100] : 75? pg pp [51,74] : 62?... [0,100] : 50? pp [26,49] : 37?... pg [0,49] : 25? pp [0,24] : 12?... 20

Recherche par interpolation (1/3) Principe de la recherche par interpolation : on améliore la recherche par dichotomie en coupant le tableau non pas au milieu, mais à un endroit «proche» de la valeur cherchée. La recherche par interpolation suppose qu'on puisse interpoler l'indice probable de la valeur recherchée. Exemple : chercher un mot dans le dictionnaire se fait par interpolation, car on est capable d'estimer, plus ou moins précisément, la page où le mot peut se trouver. Interpoler l'indice où on peut trouver un élément dans un tableau implique qu'on connaisse à l'avance la répartition des éléments (au moins approximativement). Un cas simple : les éléments sont répartis linéairement dans le tableau. 21

Recherche par interpolation (2/3) Dans le tableau jaune, l'interpolation linéaire donne 1 comme indice probable de.( 11 (l'indice réel est 490 Dans le tableau rouge, l'interpolation linéaire donne 8 comme indice probable de 71.( 8 (l'indice réel est 4 17 25 26 45 45 87 102 234 237 490 1213 5681 5690 7012 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 8000 140 7000 120 6000 100 5000 80 4000 3000 60 2000 40 1000 20 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 4 17 25 26 45 45 63 71 77 89 98 101 104 112 124 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 22

Recherche par interpolation (3/3) Si on suppose une répartition ordonnée et linéaire des valeurs dans un tableau tab, on peut interpoler linéairement la place d'un élément e recherché entre des indices i et j. t[j] y y = a*x + b a = ( tab[ j ] tab[ i ] ) / ( j i ) b = tab[ i ] - a*i e t[i] k = ( e b ) / a 0 i k? j tab.longueur-1 x L'algorithme de recherche par interpolation est le même que celui de recherche dichotomique, mais à chaque itération, au lieu de tester l'élément situé à l'indice (i+j)/2, on teste celui situé en k. 23

Tableau trié (1/2) La recherche d'élément est plus efficace dans les tableaux triés. Il est donc intéressant de pouvoir tester si un tableau est trié et, si ce n'est pas le cas, de pouvoir le trier. Tester si un tableau est trié par ordre croissant : on s'assure que chaque case (sauf la dernière) a un contenu plus petit que celui de la case suivante. fonction avec retour booléen testtrie1(int[] tab) entier i; booléen b; début b <- VRAI; pour (i allant de 0 à tab.longueur-2 pas 1) faire si (tab[i] > tab[i+1]) alors b <- FAUX; finsi finpour retourne b; fin 24

Tableau trié (2/2) On peut améliorer l'algorithme précédent en s'arrêtant dès qu'on trouve deux éléments qui ne sont pas dans le bon ordre. fonction avec retour booléen testtrie1(int[] tab) entier i; booléen b; début b <- VRAI; i <- 0; tantque (i < tab.longueur-1 et b) faire si (tab[i] > tab[i+1]) alors b <- FAUX; finsi i <- i+1; finpour retourne b; fin 25

Tri de tableaux (1/2) Occupation mémoire d'un algorithme de tri : - tri en place : les éléments sont triés dans la structure de données 5 7 23 789 43 0 23 56 12 9 - tri pas en place : on crée une nouvelle structure de données 5 7 23 789 43 0 23 56 12 9 0 5 7 9... 26

Tri de tableaux (2/2) Stabilité d'un algorithme de tri : - tri stable : l'algorithme ne modifie pas l'ordre initial des éléments égaux 5 7 23 789 43 0 23 56 12 9 0 5 7 9 12 23 23 43 56 789 - tri instable : l'algorithme modifie l'ordre initial des éléments égaux 5 7 23 789 43 0 23 56 12 9 0 5 7 9 12 23 23 43 56 789 27

Tri à bulle (1/4) Principe du tri à bulle (bubble sort) : on parcourt le tableau et on fait remonter le plus grand (ou le plus petit) élément à un bout par permutations et on recommence jusqu'à ce que le tableau soit trié. Exemple : trier par ordre croissant le tableau suivant 701 17 2 268 415 45 45 102 1- on fait passer le plus grand élément au bout par permutations successives 17 701 2 701 2682 268 701 415 415 701 45 701 45 701 102 45 102 701 2- on recommence sur le tableau moins le dernier élément 2 17 268 415 45 415 45 415 102 45 102 415 701 28

Tri à bulle (2/4) 3- on recommence sur le tableau moins les deux derniers éléments 2 17 268 45 45 102 45 102 268 415 701... 7- au septième parcours, on compare juste les deux premiers éléments 2 17 45 45 102 268 415 701 Le tri à bulle est en place. Il est stable si on permute uniquement les éléments différents. 29

Tri à bulle (3/4) Algorithme de tri à bulle d'un tableau d'entier, par ordre croissant : fonction sans retour tribulle(entier[] tab) entier i,j,temp; début pour (i allant de tab.longueur-2 à 1 pas -1) faire pour (j allant de 0 à i pas 1) faire si (tab[j] > tab[j+1]) alors temp <- tab[j]; tab[j] <- tab[j+1]; tab[j+1] <- temp; finsi finpour finpour fin NB: ce tri est stable, il serait non stable si on avait mis tab[j] >= tab[j+1] 30

Tri à bulle (4/4) Optimisation possible : on peut s'arrêter dès que le tableau est trié. fonction sans retour tribulle(entier[] tab) entier i,j,temp; booléen trié; début trié <- faux; i <- tab.longueur-2; tantque ((non trié) et (i > 0)) faire trié <- vrai; pour (j allant de 0 à i pas 1) faire si (tab[j] > tab[j+1]) alors temp <- tab[j]; tab[j] <- tab[j+1]; tab[j+1] <- temp; trié <- faux; finsi finpour i <- i-1; fintantque fin Cette amélioration n'est efficace que si le tableau est déjà «un peu» trié et qu'il devient trié «assez vite». 31

Tri à bulle boustrophédon (1/2) Une autre amélioration possible du tri bulle est le tri Boustrophedon (du nom des écritures qui changent de sens à chaque ligne) : 1- on parcourt le tableau de gauche à droite, en faisant remonter l'élément le plus grand 2- on redescend le tableau de droite à gauche, en faisant descendre le plus petit 3- on recommence en ignorant les 2 éléments déjà triés 701 17 2 17 2 268 452 268 415 45 415 102 45 102 268 45 102 415 45 102 701 Le tri Boustrophedon est plus efficace car il permet de faire descendre plus rapidement les petits éléments en bas du tableau. 32

Tri à bulle boustrophédon (2/2) On travaille entre les indices i et j : tous les éléments d'indice inférieur ou égal à i ou supérieur ou égal à j sont déjà triés. fonction sans retour tribulleboustrophédon(entier[] tab) entier i,j,k,temp; booléen trié; début trié <- faux; j <- tab.longueur; i <- -1; tantque ((non trié) et (j > i)) faire trié <- vrai; pour (k allant de j+1 à i-2 pas 1) faire si (tab[k] > tab[k+1]) alors temp <- tab[k]; tab[k] <- tab[k+1]; tab[k+1] <- temp; trié <- faux; finsi finpour i <- i-1; pour (k allant de i-1 à j+2 pas -1) faire si (tab[k] < tab[k-1]) alors temp <- tab[k]; tab[k] <- tab[k-1]; tab[k-1] <- temp; trié <- faux; finsi finpour j <- j+1; fintantque fin 33

Comparaison expérimentale des tris à bulle Test sur des tableaux d'entiers générés aléatoirement. 34

Tri par sélection (1/2) Principe du tri par sélection : on parcourt le tableau pour trouver le plus grand élément, et une fois arrivé au bout du tableau on y place cet élément par permutation. Puis on recommence sur le reste du tableau. fonction sans retour triselection(entier[] tab) entier i,j,temp,pg; debut i <- tab.longueur-1; tantque (i > 0) faire pg <- 0; pour (j allant de 0 à i pas 1) faire si (tab[j] > tab[pg]) alors pg <- j; finsi finpour temp <- tab[pg]; tab[pg] <- tab[i]; tab[i] <- temp; i <- i-1; fintantque fin 35

Tri par sélection (2/2) Le tri sélection n'effectue qu'une permutation pour remonter le plus grand élément au bout du tableau, il est donc plus efficace que le tri à bulle. Le tri sélection est en place et l'algorithme donné ici est stable. Il serait instable si on remplaçait la comparaison tab[j] > tab[pg] par tab[j] >= tab[pg]. Le tri sélection peut être amélioré en positionnant à chaque parcours du tableau le plus grand et le plus petit élément, selon le même principe que celui utilisé pour le tri à bulle boustrophédon. Dans ce cas, on fera 2 fois moins de tours de boucle tantque (on trie 2 éléments à chaque tour) mais à chaque tour, on effectuera plus d'opérations. 36

Comparaison expérimentale des tris par sélection Test sur des tableaux d'entiers générés aléatoirement. 37

Tri par insertion (1/2) Principe du tri par insertion : on prend deux éléments qu'on trie dans le bon ordre, puis un 3e qu'on insère à sa place parmi les 2 autres, puis un 4e qu'on insère à sa place parmi les 3 autres, etc. 701 17 2 1701 2701 268 452 701 415 268 45 415 701 415 268 102 45 701 415 268 45 45 701 415 45 102 701 fonction sans retour triinsertion(entier[] tab){ entier i, j, val; debut pour (i allant de 1 à tab.longueur-1 pas 1) faire val <- tab[i]; j <- i; tantque ((j > 0) et (tab[j-1] > val)) faire tab[j] <- tab[j-1]; j <- j-1; fintantque tab[j] <- val; finpour fin 38

Tri par insertion (2/2) L'algorithme de tri par insertion donné ici est en place et stable (il serait instable si on utilisait au lieu de >). Le tri par insertion est l'algorithme utilisé «naturellement» pour trier des cartes ou des dossiers. Le tri par sélection nécessite en moyenne de l'ordre de n²/2 comparaisons, n étant la taille du tableau : on fera d'abord n-1 tours de la boucle pour, puis n-2, et ainsi de suite jusqu'à 1. Le tri par insertion nécessite en moyenne de l'ordre de n²/4 comparaisons et déplacements : placer le ième élément demande en moyenne i/2 comparaisons. Le tri par insertion est donc environ deux fois plus rapide que le tri par sélection. 39

Comparaison expérimentale des tris Test sur des tableaux d'entiers générés aléatoirement. 40