Vous êtes sur la page 1sur 40

Les algorithmes de tri quasi-linéaires

Kharbane Yahya

CRMEF Marrakech-Safi
Centre de Préparation à l’Agrégation
Département d’informatique

1er juillet 2020


Introduction Diviser pour régner Tri rapide tri fusion

Introduction

Le problème consiste à organiser une collection d’objet selon un ordre


déterminé.
Les objets à trier font donc partie d’un ensemble muni d’une relation d’ordre.
Parmi les ordres les plus utilisés, on trouve l’ordre numérique et l’ordre
lexicographique.

1/37

Les algorithmes de tri quasi-linéaires


Introduction Diviser pour régner Tri rapide tri fusion

Parmi les algorithmes de tris, on distingue ceux procédant par comparaisons


successives entre éléments, dits « tris par comparaisons ».
On peut les classifier en deux groupes :
Algorithmes lents : Tri par insertion , Tri par sélection , Tri à bulles, ...
Algorithmes rapides : Tri rapide, Tri par fusion, Tri par tas ...
Dans ce cours, on s’intéressera aux Tri rapide et Tri par fusion qui reposent
sur le principe de diviser pour régner.

2/37

Les algorithmes de tri quasi-linéaires


Introduction Diviser pour régner Tri rapide tri fusion

diviser pour régner (divide and conquer en anglais) est une technique
algorithmique consistant à :
Diviser : découper un problème initial en sous-problèmes ;
Régner : résoudre les sous-problèmes (récursivement ou directement
s’ils sont assez petits) ;
Combiner : calculer une solution au problème initial à partir des
solutions des sous-problèmes.
Cette technique fournit des algorithmes efficaces pour de nombreux
problèmes, comme la recherche d’un élément dans un tableau trié (recherche
dichotomique), le tri (tri fusion, tri rapide), la multiplication de grands
nombres (algorithme de Karatsuba) ou la transformation de Fourier discrète
(transformation de Fourier rapide).

3/37

Les algorithmes de tri quasi-linéaires


Introduction Diviser pour régner Tri rapide tri fusion

Alternative 1 : ( pas sur place ! !)


Diviser : on choisit un élément du tableau au hasard qui sera ’pivot’ et
on crée trois partitions tels que : une partition contiendra le pivot
(Partition_pivot), une autre contiendra les éléments supérieurs au pivot
(Partition_sup), et une dernière partition des éléments inférieurs au
pivot (Partition_inf)
Régner : on trie les deux partitions Partition_sup et Partition_inf
récursivement. (récursivement, ou on ne fait rien s’ils sont de taille 1)
Combiner : on concatène les trois résultats.

4/37

Les algorithmes de tri quasi-linéaires


Introduction Diviser pour régner Tri rapide tri fusion

Soit la liste suivante :

5/37

Les algorithmes de tri quasi-linéaires


Introduction Diviser pour régner Tri rapide tri fusion

Soit la liste suivante :

On choisit le premier élément comme pivot

5/37

Les algorithmes de tri quasi-linéaires


Introduction Diviser pour régner Tri rapide tri fusion

On crée les trois partitions :

6/37

Les algorithmes de tri quasi-linéaires


Introduction Diviser pour régner Tri rapide tri fusion

7/37

Les algorithmes de tri quasi-linéaires


Introduction Diviser pour régner Tri rapide tri fusion

8/37

Les algorithmes de tri quasi-linéaires


Introduction Diviser pour régner Tri rapide tri fusion

1 def tri_rapide ( L ) :
2 if len ( L ) <=1:
3 return L
4 P ar tition_pivot =[ L [0]]
5 Partition_sup =[]
6 Partition_inf =[]
7 for i in range (1 , len ( L ) ) :
8 if L [ i ] > L [0]:
9 Partition_sup = Partition_sup +[ L [ i ]]
10 else :
11 Partition_inf = Partition_inf +[ L [ i ]]
12 return tri_rapide ( Partition_inf ) + Pa r ti t io n_ p iv ot + tri_rapide (
Partition_sup )

9/37

Les algorithmes de tri quasi-linéaires


Introduction Diviser pour régner Tri rapide tri fusion

Alternative 2 : ( sur place ! !)


Diviser : on choisit un élément du tableau au hasard qui sera ’pivot’ et
on permute tous les éléments de manière à placer à gauche du pivot les
éléments qui lui sont inférieurs, et à droite ceux qui lui sont supérieurs
Régner : on trie les deux moitiés de part et d’autre du pivot.

10/37

Les algorithmes de tri quasi-linéaires


Introduction Diviser pour régner Tri rapide tri fusion

Soit la liste suivante :

11/37

Les algorithmes de tri quasi-linéaires


Introduction Diviser pour régner Tri rapide tri fusion

Soit la liste suivante :

On choisit le premier élément comme pivot et on le permute avec le dernier


élément

11/37

Les algorithmes de tri quasi-linéaires


Introduction Diviser pour régner Tri rapide tri fusion

12/37

Les algorithmes de tri quasi-linéaires


Introduction Diviser pour régner Tri rapide tri fusion

13/37

Les algorithmes de tri quasi-linéaires


Introduction Diviser pour régner Tri rapide tri fusion

14/37

Les algorithmes de tri quasi-linéaires


Introduction Diviser pour régner Tri rapide tri fusion

15/37

Les algorithmes de tri quasi-linéaires


Introduction Diviser pour régner Tri rapide tri fusion

16/37

Les algorithmes de tri quasi-linéaires


Introduction Diviser pour régner Tri rapide tri fusion

17/37

Les algorithmes de tri quasi-linéaires


Introduction Diviser pour régner Tri rapide tri fusion

18/37

Les algorithmes de tri quasi-linéaires


Introduction Diviser pour régner Tri rapide tri fusion

19/37

Les algorithmes de tri quasi-linéaires


Introduction Diviser pour régner Tri rapide tri fusion

20/37

Les algorithmes de tri quasi-linéaires


Introduction Diviser pour régner Tri rapide tri fusion

1 def partitonner (L , debut , fin ) :


2 L [ debut ] , L [ fin ]= L [ fin ] , L [ debut ]
3 i = debut
4 for j in range ( debut , fin ) :
5 if L [ j ] < L [ fin ] :
6 L [ i ] , L [ j ]= L [ j ] , L [ i ]
7 i = i +1
8 L [ i ] , L [ fin ]= L [ fin ] , L [ i ]
9 return i
10
11 def tri_rapide (L , debut , fin ) :
12 if debut < fin :
13 i = partitonner (L , debut , fin )
14 tri_rapide (L , debut ,i -1)
15 tri_rapide (L , i +1 , fin )

21/37

Les algorithmes de tri quasi-linéaires


Introduction Diviser pour régner Tri rapide tri fusion

Diviser : on découpe la liste à trier en deux sous-listes de tailles égales


Régner : on trie les deux sous-listes (récursivement, ou on ne fait rien
s’ils sont de taille 1)
Combiner : on fusionne les deux sous-tableaux triés d’une manière à
obtenir une permutation triée de la liste initiale

22/37

Les algorithmes de tri quasi-linéaires


Introduction Diviser pour régner Tri rapide tri fusion

Soit la liste suivante :

23/37

Les algorithmes de tri quasi-linéaires


Introduction Diviser pour régner Tri rapide tri fusion

On découpe la liste en deux sous-listes de tailles égales

24/37

Les algorithmes de tri quasi-linéaires


Introduction Diviser pour régner Tri rapide tri fusion

25/37

Les algorithmes de tri quasi-linéaires


Introduction Diviser pour régner Tri rapide tri fusion

26/37

Les algorithmes de tri quasi-linéaires


Introduction Diviser pour régner Tri rapide tri fusion

27/37

Les algorithmes de tri quasi-linéaires


Introduction Diviser pour régner Tri rapide tri fusion

28/37

Les algorithmes de tri quasi-linéaires


Introduction Diviser pour régner Tri rapide tri fusion

29/37

Les algorithmes de tri quasi-linéaires


Introduction Diviser pour régner Tri rapide tri fusion

30/37

Les algorithmes de tri quasi-linéaires


Introduction Diviser pour régner Tri rapide tri fusion

31/37

Les algorithmes de tri quasi-linéaires


Introduction Diviser pour régner Tri rapide tri fusion

32/37

Les algorithmes de tri quasi-linéaires


Introduction Diviser pour régner Tri rapide tri fusion

33/37

Les algorithmes de tri quasi-linéaires


Introduction Diviser pour régner Tri rapide tri fusion

34/37

Les algorithmes de tri quasi-linéaires


Introduction Diviser pour régner Tri rapide tri fusion

35/37

Les algorithmes de tri quasi-linéaires


Introduction Diviser pour régner Tri rapide tri fusion

36/37

Les algorithmes de tri quasi-linéaires


Introduction Diviser pour régner Tri rapide tri fusion

1 def fusion ( L ) :
2 if len ( L ) <=1:
3 return L
4 n = len ( L )
5 partie_gauche = L [: n //2]
6 partie_droite = L [ n //2:]
7 partie_gauche = fusion ( partie_gauche )
8 partie_droite = fusion ( partie_droite )
9 i = j =0
10 Resultat =[]
11 while i < len ( partie_gauche ) and j < len ( partie_droite ) :
12 if partie_gauche [ i ] < partie_droite [ j ]:
13 Resultat = Resultat +[ partie_gauche [ i ]]
14 i = i +1
15 else :
16 Resultat = Resultat +[ partie_droite [ j ]]
17 j = j +1
18 if i == len ( partie_gauche ) :
19 Resultat = Resultat + partie_droite [ j :]
20 else :
21 Resultat = Resultat + partie_gauche [ i :]
22 return Resultat

37/37

Les algorithmes de tri quasi-linéaires

Vous aimerez peut-être aussi