Lycée Chrestien de Troyes DS n°2 d’Informatique pour tous MP1617
Exercice 3 −Nombre d’occurences d’une valeur dans une liste
On se propose d’écrire deux versions, en langage PYTHON, de la fonction Occurence d’argument (L,x)
où :
•Lreprésente une liste;
•xreprésente une valeur;
qui retourne le nombre d’occurences de xdans la liste L.
1. Écrire une version non récursive de la fonction Occurence.
2. Écrire une version récursive de la fonction Occurence, basée sur le principe de dichotomie :
on appelle Occurence avec deux sous-listes obtenues en coupant la première liste en deux (ou
presque), de sorte que les deux sous-listes aient des longueurs strictement plus petites que la
longueur de la première liste. On pourra faire usage du slicing.
3. Démontrer la terminaison de la fonction construite en 2. Pour cela, on pourra établir, par ré-
currence, que pour tout n∈N:
P(n) : La fonction s’arrête et renvoie un résultat pour toute liste de longueur n.
Exercice 4 −Tri rapide
On s’intéresse à une méthode de tri d’une liste d’entiers (par ordre croissant disons) : le tri rapide.
Le principe de ce tri est basé sur une stratégie de « diviser pour régner ». Il divise une collection
en deux collections de petits et grands éléments : tous les éléments de la première collection sont
inférieurs à ceux de la deuxième collection. Ce principe est ensuite ré-appliqué sur chacune des 2
sous-collections. L’algorithme s’écrit comme suit.
•Sélection d’un élément (appelé pivot) choisi arbitrairement (au début, ou à la fin, ou au milieu
ou presque, ou aléatoirement...) dans la liste.
•Partitionnement : on modifie la liste pour mettre tous les éléments plus petits que le pivot
devant et les plus grands derrière (le pivot devient rangé à sa position définitive).
•Rappel du tri sur les 2 parties (petits et grands) de la liste.
Pour partitionner une sous-liste :
•on place le pivot à la fin (arbitrairement), en l’échangeant avec le dernier élément de la sous-
liste;
•on place tous les éléments inférieurs au pivot au début de la sous-liste;
•on place le pivot à la fin des éléments déplacés.
1. Écrire une fonction Partitionner en langage PYTHON d’argument (L,d,p,f) où :
•Lreprésente une liste d’entiers;
•d(indide de début), p(indice de pivot), f(indice de fin) représentent des indices de la liste
Lvérifiant d≤p≤f;
qui partitionne la sous liste L[d:f+1], avec pcomme indice de pivot, suivant la méthode dé-
crite ci-dessus et qui retourne l’indice de la nouvelle position du pivot après partitionnement.
2. Écrire une fonction TriRapide en langage PYTHON d’argument (L,d,f) où :
•Lreprésente une liste d’entiers;
•d(indide de début), f(indice de fin) représentent des indices de la liste Lvérifiant d≤f;
et qui trie la sous liste L[d:f+1] suivant la méthode du tri rapide décrite ci-dessus.
3. Estimer le nombre d’affectations et de comparaisons nécessaires pour le tri rapide dans le pire
des cas.
4. Que dire du coût mémoire pour le tri rapide?
5. Présenter une autre méthode de tri rencontrée cette année. On attend non seulement un nom,
mais aussi une esquisse d’algorithme.
2/2