5.3 Tris séquentiels
Dans la suite, on considère un dictionnaire de mots de quatre lettres.
#define taille_dico 979
/* Un dictionnaire de mots de quatre lettres */
char *dico[taille_dico] = { "drap", "nuee", "agit", "mais", "krak", "eric",
"aaai", "agir", "drop", "dome", "buis", "rode", "puce", "roda", "drue",
"buse", "bure", "rode", "haie", "hais", "hait", "puer", "hall", "role",
"halo", "haro", "puis", "hase", "decu", "pull", "vais", "puma", "haut",
"valu", "vain", "vase", "alea", "vamp", "thon", "vaux", "vaut", "afin",
"fier", "fief", "mica", "fiel", "thym", "fini", "midi", "epie", "meat",
"mien", "fisc", "miel", "film", "mike", "feru", "tige", "mise", "epia",
"tele", "fevr", "tien", "miss", "mile", "tint", "aout", "fetu", "tilt",
"mita", "tenu", "mite", "agio", "agir", "agit", "mite", "fele", "ogre",
"fela", "fele", "meme", "pres", "pref", "aere", "tete", "pret", "tetu",
"hele", "hote", "here", "foin", "mode", "font", "foot", "moka", "fond",
"fora", "fort", "toge", "todd", "mont", "mord", "mors", "fore", "mort",
"four", "toit", "tond", "moto", "tors", "tort", "moue", "moud", "aout",
"yvan", "tome", "tord", "mous", "yves", "tous", "toux", "flan", "tour",
"tout", "oeil", "veau", "utah", "utah", "flou", "flot", "heur", "vend",
"venu", "vent", "velu", "oeuf", "vers", "vert", "flux", "veto", "veuf",
"veut", "veux", "hale", "hale", "etal", "etai", "etat", "etau", "hata",
"hate", "ores", "have", "buee", "hate", "jusa", "hair", "etui", "aire",
"frac", "frai", "fret", "trie", "cade", "tram", "fris", "frit", "froc",
"cage", "cadi", "trac", "duel", "jade", "cake", "tria", "cane", "dune",
"camp", "trio", "dura", "cafe", "troc", "mole", "came", "trot", "jais",
"rude", "trop", "trou", "aine", "ruer", "janv", "tole", "jase", "jars",
"jasa", "dure", "truc", "java", "jazz", "jase", "rush", "tsar", "epee",
"clot", "aile", "aigu", "aide", "aine", "hele", "hier", "aile", "vice",
"vecu", "aise", "aera", "hela", "vint", "viol", "aise", "visa", "vise",
"aere", "hetu", "vive", "vite", "velo", "ange", "once", "vise", "anis",
"anon", "onde", "anse", "ansi", "anus", "onze", "cene", "vetu", "onyx",
"cepe", "hors", "home", "ceci", "houx", "vois", "voir", "voit", "voeu",
"voix", "cout", "houe", "voie", "volt", "vont", "jean", "coit", "cens",
"alfa", "cent", "allo", "vote", "vous", "cerf", "cern", "aloi", "jerk",
"ceux", "jeun", "alto", "vlsi", "amas", "amen", "amer", "ames", "omet",
"omis", "omit", "arcs", "caid", "oral", "orge", "vrac", "vrai", "fuel",
"ardu", "ardt", "fuit", "chas", "char", "orme", "aria", "chef", "hote",
"laid", "sage", "lait", "land", "muni", "tuer", "mule", "lama", "lard",
"ores", "laps", "turc", "turf", "lame", "fuir", "chai", "chah", "sapa",
"chat", "mure", "muer", "muet", "full", "sake", "cher", "chez", "saga",
"saur", "oser", "chic", "tuez", "lame", "choc", "chou", "mura", "musc",
"muse", "sain", "sais", "sait", "sana", "sang", "sans", "sali", "apex",
"fute", "sari", "sape", "chut", "sauf", "saut", "sape", "osez", "saxo",
"jill", "ciel", "cinq", "cime", "opus", "apre", "opte", "apte", "opta",
"opte", "aval", "cola", "john", "lese", "jonc", "joli", "cote", "coco",
"tres", "coke", "coin", "conf", "seau", "colt", "seme", "coma", "avec",
"aveu", "avez", "corp", "joie", "cosy", "clip", "avis", "seme", "lest",
"sein", "coud", "coup", "cour", "sens", "sent", "self", "sera", "serf",
"seve", "sers", "zele", "sert", "cote", "type", "joug", "typo", "jour",
"auto", "ubac", "ovni", "owen", "legs", "clam", "clan", "clef", "aube",
"lent", "clin", "soul", "clos", "clou", "sema", "leur", "sept", "club",
"seul", "type", "sexe", "sexy", "skie", "ucla", "crue", "atre", "gain",
"huit", "gang", "hune", "gala", "gale", "naja", "html", "cote", "nain",
"cran", "shah", "laic", "aube", "cric", "crin", "cris", "croc", "auge",
"skia", "cone", "audy", "aune", "huer", "crut", "aura", "cote", "gant",
"oued", "lice", "auto", "gars", "nais", "lift", "lien", "ours", "nasa",
"lion", "sied", "nazi", "lira", "lire", "zebu", "lise", "lisp", "show",
"zele", "lesa", "zinc", "zero", "azur", "lied", "lier", "lieu", "lino",
"sien", "snob", "silo", "sire", "site", "lese", "oree", "gene", "sofa",
"loin", "loir", "long", "lors", "soif", "axer", "soir", "ieee", "ayez",
"zone", "sole", "soli", "sors", "loup", "zona", "zone", "zoom", "gout",
"noel", "souk", "soya", "mans", "gere", "soda", "soja", "neuf", "soin",
"soit", "ieee", "sono", "sont", "ibid", "ibis", "geai", "solo", "slip",
"loto", "sort", "slow", "gens", "nerf", "elle", "nait", "naif", "ouie",
"ouir", "cube", "erra", "bail", "bain", "cuir", "gata", "gate", "judo",
"pack", "jube", "gate", "page", "juin", "pane", "quel", "jury", "jupe",
"paon", "cure", "pars", "paru", "baba", "cuba", "paul", "gite", "watt",
"erre", "apic", "cube", "cuis", "cuit", "banc", "bang", "jude", "quai",
"cure", "basa", "base", "juif", "erre", "cuti", "baud", "baux", "pain",
"pair", "paix", "quoi", "pale", "base", "jute", "parc", "pari", "part",
"papa", "pape", "neon", "pays", "esse", "gere", "spie", "spot", "neve",
"gena", "nier", "girl", "unir", "unit", "unix", "gera", "noce", "gond",
"hifi", "gene", "pere", "noir", "noix", "gnon", "nord", "gene", "nous",
"ieee", "peau", "idem", "ides", "pend", "goal", "perd", "perl", "pers",
"peur", "peut", "ebat", "gong", "golf", "pese", "pese", "beau", "pame",
"glas", "pale", "pama", "pame", "ilot", "pate", "pesa", "stem", "echo",
"echu", "pate", "ecot", "swap", "ecru", "gras", "bale", "stuc", "grog",
"gros", "urge", "bati", "daim", "luge", "atil", "race", "dame", "urne",
"etes", "rame", "luit", "suez", "luxe", "kart", "etre", "star", "raid",
"suce", "suif", "rail", "suis", "suit", "suiv", "rang", "luth", "rare",
"surf", "phil", "stop", "yard", "grec", "greg", "user", "gril", "gris",
"beat", "dada", "dais", "lune", "grue", "kaki", "pied", "dard", "pieu",
"daze", "lune", "urge", "yack", "suer", "lump", "race", "suie", "rama",
"rame", "rami", "rapt", "luxa", "luxe", "rave", "rata", "rate", "indu",
"usez", "bien", "pneu", "beer", "bebe", "bile", "bise", "pige", "exil",
"pion", "egal", "pire", "pipe", "inca", "pise", "boxe", "idee", "inne",
"ions", "pois", "poix", "inox", "pool", "poli", "dela", "insu", "port",
"beta", "bete", "pope", "edam", "pene", "pouf", "pour", "poux", "bock",
"edit", "kent", "rein", "bois", "boit", "bond", "boni", "plan", "iode",
"boom", "bord", "iode", "bouc", "boue", "boul", "bous", "bout", "poil",
"pond", "pont", "boxa", "boxe", "polo", "iota", "porc", "pore", "yeux",
"plut", "dent", "demi", "bleu", "blet", "rene", "lynx", "bloc", "lyre",
"lyse", "deux", "rala", "rale", "rend", "plat", "utah", "plot", "elle",
"suca", "bref", "irai", "imbu", "rale", "irez", "iris", "fame", "irmx",
"guet", "pris", "prit", "prix", "imsl", "tact", "nuit", "malt", "mare",
"mari", "taie", "tain", "bras", "tank", "taon", "talc", "ntsc", "maux",
"bric", "brie", "item", "brio", "brin", "bris", "broc", "brou", "taux",
"face", "unir", "fade", "fane", "irmx", "mach", "brun", "brut", "rhum",
"deja", "faim", "mage", "fais", "fait", "fana", "fane", "unir", "faon",
"uucp", "pole", "fard", "fart", "mail", "main", "dine", "khan", "marc",
"mark", "mars", "isba", "faut", "dina", "faux", "dine", "tais", "tait",
"tant", "dery", "rien", "dime", "riez", "kilt", "math", "ture", "tard",
"reel", "tapi", "ring", "maya", "rira", "rire", "tare", "taxi", "issu",
"dick", "rite", "defi", "dieu", "deni", "dira", "dire", "dise", "rime",
"king", "kilo", "dito", "reer", "kiwi", "rima", "kepi", "rime", "uree",
"dois", "donc", "rock", "rixe", "dors", "dose", "kola", "dota", "acte",
"rond", "roll", "dose", "gres", "ivre", "rene", "dock", "fend", "roux",
"teck", "dodu", "mens", "ment", "deca", "doit", "abat", "feue", "dont",
"recu", "tend", "feve", "tenu", "dort", "dosa", "abbe", "meus", "meut",
"test", "doux", "yoga", "abus", "abri", "dote", "doue", "rose", "abus",
"elan", "roue", "mout", "fera", "rose", "ocre", "roue", "menu", "elit",
"elis", "elle", "obus", "mess", "male", "elue", "elut", "acre", "acre",
"acte", "emet", "emit", "emir", "emis", "emoi", "item", "oter", "emue",
"emut" };
Ce dictionnaire est stocké dans une variable globale et on se
propose de le trier.
Pour ce faire, on rappelle qu'il est possible de comparer deux
chaînes de caractères en utilisant la fonction strcmp
dont la déclaration est dans string.h (pour plus de
détails, man strcmp).
5.3.1 Tri par sélection
L'algorithme de tri le plus simple consiste à trouver l'emplacement
du plus petit éléments dans la table considérée. Une fois cet
emplacement trouvé, on échange le premier élément de la table
avec le plus petit. Pour continuer, on recommence ces opérations sur
la table composée des éléments restant.
Exercice 5.7 --- Tri par sélection.
Implantez le tri par sélection de la table dico. Pour ce
faire, construisez une fonction principale et deux fonctions
auxiliaires (recherche du plus petit élément et tri).
Étude de la complexité.
À chaque itération i, on compare l'élément i à
l'élément classé après lui. Si t représente la taille de
la table, on fait donc t-i comparaisons. Comme il y a t
itérations, on a t(t-1)/2 comparaisons et n-1 échanges. La
complexité est donc de l'ordre de t2.
Exercice 5.8 --- Tri bulle.
Le tri bulle consiste à parcourir la table à trier en
intervertissant toute paire d'éléments consécutifs non
ordonnés afin qu'après un parcours, le plus grand élément se
retrouve à la fin de la table. On recommence cette opération
avec la table considérée sans le dernier éléments.
Implantez un tri bulle.
5.3.3 Tri par insertion
Exercice 5.9 --- Tri par insertion.
Dans la méthode du tri par insertion, on ordonne les deux premiers
éléments de la table. Puis, on considère le troisième et on
le met à sa place parmi les deux premiers. Ainsi, on considère
les j-1 premiers éléments de la table comme triés. On
prend la jième et on le met à sa place dans la partie déjà
triée.
Exercice 5.10 --- Tri Shell.
Une variante du tri par insertion a été introduite par D.L.
Shell en 1959. Le principe est de supposer que la table à trier
est presque en ordre. Au lieu de comparer les éléments
adjacents pour l'insertion, on les compares tous les un
éléments avec un+1=3un+1.
Implantez un tri shell.
Pour tout commentaire : Alexandre Sedoglavic.