Licence 3, semestre 5, 2010–2011 Programmation Fonctionnelle
TD5
1 Tri par Tas
Nous nous int´eressons `a l’impl´ementation d’un algorithme de tri efficace pour des listes d’entiers. Cet algo-
rithme reposera sur une structure de donn´ees appel´ee tas. Les tas repr´esentent des ensembles (´eventuellement
avec des r´ep´etitions) o`u l’acc`es au plus petit ´el´ement est efficace.
Un tas peut ˆetre repr´esent´e par un arbre binaire poss´edant la propri´et´e que l’entier stock´e `a la racine
de l’arbre est inf´erieur ou ´egal `a tous les ´el´ements de ses sous-arbres gauche et droit, ces sous-arbres ´etant
´egalement des tas.
Nous utiliserons le type Objective Caml suivant pour repr´esenter les tas.
type tas = Vide | Noeud of int * tas * tas
On commence par d´efinir les fonctions d’ajout et de suppression sur les tas, en supposant donn´ee une
fonction fusion : tas -> tas -> tas pour faire l’union de deux tas.
1. efinir une fonction enleve_racine de type tas -> tas qui supprime le plus petit ´el´ement d’un tas.
2. efinir une fonction ajouter de type tas -> int -> tas pour ajouter un ´el´ement dans un tas.
`
A l’aide des fonctions enleve_racine et ajouter, il est facile d’impl´ementer le tri par tas.
3. efinir une fonction tas_of_list de type int list -> tas qui construit un tas `a partir d’une liste
d’entiers.
4. efinir une fonction list_of_tas de type tas -> int list qui renvoie la liste, par ordre croissant,
des ´el´ements d’un tas.
5. En utilisant les fonctions pr´ec´edentes, d´efinir une fonction trier de type int list -> int list qui
trie par ordre croissant une liste d’entiers.
La fusion de deux tas est l’op´eration la plus complexe. Supposons donn´es deux tas aet bnon-vides
(l’op´eration de fusion est imm´ediate quand l’un des deux tas est vide). Nous avons donc a = Noeud(m,g,d)
et b = Noeud(n,l,r). Supposons mn(le cas nmest sym´etrique). La fusion consiste `a construire un
nouveau tas dont la racine est m, le sous-arbre gauche est det le sous-arbre droit est le r´esultat de la fusion
de get b.
6. efinir la fonction fusion de type tas -> tas -> tas en suivant l’algorithme donn´e ci-dessus.
Modularit´e. D´efinir un foncteur HeapSort permettant de s’abstraire des ´el´ements et de la relation d’ordre
sous-jacente `a la structure de tas.
2 Tri par s´election
Le but de cette partie est de r´ealiser une fonction de tri par ordre croissant des listes d’entiers. La m´ethode
utilis´ee sera celle du tri par s´election, qui, ´etant donn´ee une liste l, consiste `a :
renvoyer [], si lest la liste vide ;
sinon, rechercher l’´el´ement minimum mde l;
supprimer la premi`ere occurence de mdans l, on obtient alors une liste s;
trier ecursivement la liste s, on obtient alors la liste tri´ee ls et on retourne la liste m::ls.
1
1. En utilisant de pr´ef´erence un it´erateur sur les listes, d´efinir une fonction min_liste de type int ->
int list -> int qui, ´etant donn´es un entier xet une liste l, renvoie le minimum mde lsi m<xet
xsinon.
2. efinir une fonction supprimer de type int -> int list -> int list qui, ´etant donn´es un entier
xet une liste l, supprime la premi`ere occurence (si elle existe) de xdans l.
3. En utilisant les deux fonctions pr´ec´edentes, d´efinir une fonction trier de type int list -> int list
qui permet de trier par ordre croissant une liste d’entiers ;
4. efinir une fonction de tri, toujours par ordre croissant, qui soit r´ecursive terminale. Vous remplacerez
pour cela la fonction min_list par une fonction max_list de type int -> int list -> int list
tel que max_list x l renvoie le premier ´el´ement de lsup´erieur `a x, et xsinon.
2
1 / 2 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !