DEUG MIAS 24

 

Types et Structures de données

 

TD 12

 

Le tri rapide (quick sort)

 

 

1.Présentation

Le tri rapide permute sur place les éléments d'un tableau spécifié pour les ranger dans l'ordre croissant d'une relation d'ordre spécifiée. Pour un tableau de n éléments, sa complexité au pire est en n2 mais sa complexité moyenne en nlog(n).

Nous voulons écrire une définition de la fonction qs : ('a -> 'a -> bool) -> 'a vect -> unit telle que [qs inf t] trie sur place, suivant l'ordre croissant de la relation d'ordre [inf], les éléments du tableau [t].

Je vous propose d'écrire deux versions simples de l'algorithme, variantes de la même technique.

2.Première version

La fonction qs est définie à l'aide de deux fonctions auxiliaires internes : disposant dans leur environnement global de la relation d'ordre [inf] et du tableau [t], paramètres de la fonction [qs].

2.1.La fonction place (i, j)

Pour établir cette dernière propriété, on choisit comme élément "pivot" l'élément t.(i) que l'on nomme p.

On définit une boucle utilisant deux indices l et k, boucle construite sur l'invarient suivant :

2.1.1.initialisation

Écrire la déclaration locale multiple permettant d'initialiser cette boucle.

2.1.2.Corps de la boucle

On compare le premier élément non testé t.(l) à p :

2.1.3.Poursuite de la boucle

Quelle propriété sur l et k permet de vérifier qu'il reste encore des éléments à tester ? L'écrire comme condition de la boucle while.

2.1.4.Fin de la boucle

Lorsque tous les éléments, d'indice compris entre i+1 et j inclus ont été testés (et éventuellement permutés), il ne reste plus qu'à permuter l'élément p d'indice i et l'élément d'indice k et retourner la valeur de l'indice k.

2.2.La fonction récursive qsr (i, j)

Elle doit trier sur place les seuls éléments du tableau t compris entre les indices i et j inclus sans modifier le reste du tableau.

2.2.1.Dans le cas général

Pour effectuer le tri des éléments de l'intervalle d'indice i..j,

2.2.2.Arrêt de la récursivité

Dans quels cas doit-on arrêter la récursivité ?

Écrire une déclaration de la fonction qsr.

2.3.La fonction qs

Écrire sa définition pour réaliser le tri de l'ensemble du tableau.

2.4.Tester cette définition

3.Seconde version

On modifie la seule fonction place pour la rendre un peu plus efficace. La modification porte sur le corps de la boucle décrit au paragraphe 2.1.2. Dans la partie sinon, avant d'effectuer la permutation des éléments t.(l) et t.(k), on décrémente l'indice k tant que l'élément t.(k) vérifie not (inf t.(k) p) et donc peut rester en place. Quelles précautions prendre et quelles actions effectuer pour pour rétablir l'invarient de boucle ?

Écrire et tester cette version finale.