0% ont trouvé ce document utile (0 vote)
62 vues27 pages

Méthodes de Tri en Informatique

Le document présente plusieurs algorithmes de tri, notamment le tri à bulles, le tri par sélection, le tri par insertion, le tri rapide et le tri par fusion, en expliquant leur principe et leur implémentation en Python. Chaque méthode est accompagnée d'une analyse de complexité, soulignant les performances relatives de chaque algorithme. Enfin, une comparaison des complexités des différentes méthodes de tri est fournie.

Transféré par

Zakaria Asraoui
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PPTX, PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
62 vues27 pages

Méthodes de Tri en Informatique

Le document présente plusieurs algorithmes de tri, notamment le tri à bulles, le tri par sélection, le tri par insertion, le tri rapide et le tri par fusion, en expliquant leur principe et leur implémentation en Python. Chaque méthode est accompagnée d'une analyse de complexité, soulignant les performances relatives de chaque algorithme. Enfin, une comparaison des complexités des différentes méthodes de tri est fournie.

Transféré par

Zakaria Asraoui
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PPTX, PDF, TXT ou lisez en ligne sur Scribd

CPGE - AGADIR MP-PSI

MÉTHODES DE TRIS

[Link]
1
DEFINITION
Un algorithme de tri est, en informatique ou
en mathématiques, est un algorithme qui
permet d'organiser une collection d'objets
selon un ordre déterminé. Les objets à trier
font donc partie d'un ensemble muni d'une
relation d'ordre. Les ordres les plus utilisés
sont l’ordre numérique et l'ordre
lexicographique.

Source : Wikipédia
2
I- TRI A BULLES

Principe :
Comparaison 2 à 2 des éléments
adjacents
et échange s'ils ne sont pas ordonnés.
Le programme s'arrête lorsqu'on
parcourt la liste sans faire d'échange
Comme les bulles, les plus grands
éléments remontent en fin de liste
3
I- TRI A BULLES
def triBulles (T):
echange = True
n=len(T)
while echange == True :
echange = False
for i in range(0,n-1) :
if(T[i]> T[i+1]):
T[i],T[i+1]=T[i+1],T[i]
echange = True
n=n-1

Complexi O(n2
té : ) 4
II- TRI PAR SÉLECTION

Principe :
 Recherche du plus petit élément du tableau et
échange
avec le premier élément
 Recherche du plus petit élément du tableau entre
les positions 2 et n-1 et échange avec le second
élément
 ...
 Recherche du plus petit élément entre les positions
n-2 et n-1 et échange avec élément en position n-2
5
II- TRI PAR SÉLECTION
def triSelection (T):
for i in range(0,len(T)-1):
pmin= i
for j in range (i+1, len(T)):
if T[j] < T [pmin]:
pmin= j
T[i],T [pmin] = T[pmin], T[i]

Complexi O(n2
té : ) 6
III- TRI PAR INSERTION :

Principe :
• La liste étant triée jusqu'à l'élément i-1,
• insérer l'élément i à sa place parmi les i

premiers éléments

7
III- TRI PAR INSERTION :
def tri_Insertion(T) :
n=len(T)
for i in range(1,n):
v = T[i]
j = i
while j>0 and T[j-1]> v :
T[j]= T[j-1]
j = j-1
T[j]= v

Complexi O(n2 8
IV- TRI RAPIDE
QUICK SORT

Le tri rapide (en anglais quick sort) est


un algorithme de tri inventé par C.A.R.
Hoare en 1961 et fondé sur la méthode
de conception diviser pour régner.
Son principe consiste à séparer
l’ensemble des éléments en deux
parties.

9
IV- TRI RAPIDE
Principe :

L'algorithme peut s’effectuer récursivement:


 une valeur pivot est choisie au hasard. (peut aussi

être le premier ou le dernier élément de la liste à


trier).
 On crée un premier sous-ensemble constitué des

éléments plus petits que le pivot. On les place à


gauche du pivot.
 On crée de la même façon un deuxième sous-

ensemble constitué des éléments plus grands que le


pivot. On les place à droite de celui-ci.
 On procède de même, par récursivité, sur les deux

sous-ensembles jusqu’à obtenir des sous ensembles


d'un seul élément. 10
IV- TRI RAPIDE
Exemple1 :

11
IV- TRI RAPIDE

Exemple 2 :

Soit la liste : L = [ 4, 23, 3, 42, 2, 14, 45, 18, 38, 16 ]


Prenons comme pivot la dernière valeur
pivot = 16
Nous obtenons donc :
L1 = [4, 14, 3, 2]
L2 = [23, 45, 18, 38, 42]
A cette étape voici l'arrangement de L :
L = L1 + [pivot] + L2 = [4, 14, 3, 2, 16, 23, 45, 18,
38, 42]

12
IV- TRI RAPIDE

En appliquant la même démarche au deux


sous-listes : L1 (pivot=2) et L2 (pivot=42)
[4, 14, 3, 2, 16, 23, 45, 18, 38, 42]
nous obtenons :
L11=[ ] liste vide L21=[23, 38, 18]
L12=[3, 4, 14] L22=[45]
L1=L11 + pivot + L12 = (2,3, 4, L2=L21 + pivot + L22 = (23, 38, 18,
14) 42, 45)

13
TRI PRAPIDE –PYTHON-
SOLUTION 1
def Trirapide(L):
if L==[]: return[]
#on va balayer la liste L et repartir les valeurs
n=len(L)
L1=[]
L2=[]
pivot=L[0] #ici on a pris le premier élément comme pivot.
for k in range(1,n):
if L[k]<= pivot:
#L1 reçoit les éléments plus petits
[Link](L[k])
else:
#L2 reçoit les éléments plus grands
[Link](L[k])
L = Trirapide(L1) + [pivot] + Trirapide(L2)
return L

14
TRI PRAPIDE –PYTHON-
SOLUTION 2

Pour implémenter l'algorithme tri rapide on a besoin de programmer


trois fonctions:

1. La fonction :
partitionner(T, premier, dernier) prend le tableau T et deux
indices premier et dernier en arguments, (avec premier et dernier
inclus). On suppose qu'il y a au moins un élément dans ce segment,

2. La fonction :
tri_Rapide_Partition(T,premier,dernier): qui permet de trier
le tableau T en le partitionnant récursivement en sous-tableaux.

3. La fonction :
triRapide(T) permettant de trier le tableau T en utilisant la
fonction tri_Rapide_Partition.

15
TRI PRAPIDE –PYTHON-
SOLUTION 2
1. La fonction :
partitionner(T, premier, dernier) prend le tableau T et deux
indices premier et dernier qui permet de partitionner le tableau T
en 2 parties et positionne le pivot à sa position définitive et
retourne son indice.
def partitionner(T, premier, dernier):
#on prend le dernier élément comme pivot.
pivot = T[dernier]
j = premier
for i in range(premier, dernier) :
if T[i]<= pivot :
T[i],T[j]=T[j],T[i]
j=j+1
T[dernier],T[j]=T[j],T[dernier]
return j #position définitive du pivot 16
TRI PRAPIDE –PYTHON-
SOLUTION 2
2. La fonction :
tri_Rapide_Partition(T,premier,dernier): qui permet de
trier le tableau T en le partitionnant récursivement en sous-
tableaux.

def tri_Rapide_Partition (T, premier, dernier):


if premier < dernier :
#déterminer la position d’un pivot
p=partitionner(T, premier, dernier)

#Trier le sous-Tableau gauche


tri_Rapide_Partition(T, premier, p-1)

#Trier le sous-Tableau droit


tri_Rapide_Partition(T, p+1, dernier)

17
TRI PRAPIDE –PYTHON-
SOLUTION 2
3. La fonction :
triRapide(T) permettant de trier le tableau T en appelant la
fonction tri_Rapide_Partition.

def triRapide(T):
tri_Rapide_Partition( T, 0, len(T) -1 )

Appel.

>>> L = [ 4, 23, 3, 42, 2, 14, 4,45, 18, 38, 16 ]


>>> triRapide(L)
>>> L
[2, 3, 4, 4, 14, 16, 18, 23, 38, 42, 45]

18
TRI PRAPIDE
COMPLEXITÉ
 La fonction partitionner fait toujours exactement dernier –
premier- 1 comparaisons.
 Si La fonction partitionner détermine un segment de longueur
K et un autre de longueur N-1-k, la fonction tri_
Rapide_Partition va donc effectuer N- 1 comparaisons par
l'intermédiaire de partitionner, puis d'autres comparaisons
par l'intermédiaire des deux appels récursifs à la fonction
tri_Rapide_Partition
 Le pire des cas correspond à K=0 (c'est à dire quand une
des parties est vide et l'autre contient n-1), ce qui donne, en
notant C(N) la complexité du tri d'un tableau de longueur N,
l'équation de récurrence suivante:
C(N)= N-1+ C(N-1)
Donc C(N)= N2/2 , d'où la complexité est O(N2)
 Le meilleur des cas correspond à un segment coupé en
deux moitiés égales, c'est-à-dire K = N/2. L'équation de
récurrence devient alors: 19
V- TRI PAR FUSION

Principe :
Le tri par fusion est un
algorithme de tri basé sur
la technique algorithmique
diviser pour régner.
L'opération principale de
l'algorithme est la fusion,
qui consiste à réunir deux
listes triées en une seule.
20
V- TRI PAR FUSION
Principe :
Le principe de cet algorithme tend à adopter une
formulation récursive :

 On découpe les données à trier en deux parties plus


ou moins égales

 On trie les 2 sous-parties ainsi déterminées

 On fusionne les deux sous-parties pour retrouver les


données de départ

21
V- TRI PAR FUSION
Exemple:

22
V- TRI PAR FUSION
Implémentation :

L'implémentation de cet algorithme repose


essentiellement en 2 fonctions :

Fusion :Permet de fusionner deux listes


triées de telle sorte que la liste résultante
la soit aussi.

triFusion : Une fonction récursive qui


assure le découpage de la liste et l'appel de
la fonction de fusion.
23
V- TRI PAR FUSION
Fonction Fusion :

def fusion(L1, L2):


res = [ ]
i, j= 0, 0
while i< len(L1) and j< len(L2):
if L1[i] <= L2[j]:
[Link](L1[i])
i += 1
else:
[Link](L2[j])
j += 1
res+=L1[i:]
res+=L2[j:]
return res
24
V- TRI PAR FUSION
Fonction triFusion :

def triFusion(L):
if len(L) <= 1: return L
m = len(L) // 2
return fusion( triFusion(L[:m]),
triFusion(L[m:]))

Appel.

>>> L = [ 4, 23, 3, 42, 2, 14, 4,45, 18, 38, 16 ]


>>>L=triFusion(L)
>>> L
[2, 3, 4, 4, 14, 16, 18, 23, 38, 42, 45]

25
V- TRI PAR FUSION
COMPLEXITÉ
Si on note :
C(N) : le nombre total de comparaisons effectuées par la
fonction triFusion
f (N) : le nombre total de comparaisons effectuées par la
fonction Fusion
Pour trier un tableau de longueur N, on a l’équation de récurrence suivante:
C(N)=2.C(N/2)+ f (N)
Les deux appels récursifs se font sur deux segments de même longueur N/2
• Dans le meilleur des cas, la fonction Fusion n'examine que les éléments de l'un
des deux segments car ils sont tous plus petits que ceux de l'autre segment.
Dans ce cas f (N)= N/2, donc C(N)= (½).[Link](N) , d'où la complexité est :
O([Link](N))

•Dans le pire des cas, tous les éléments sont examinés par la fonction Fusion
Dans ce cas f (N)= N-1,
donc C(N)= [Link](N). D'où la complexité est :
O([Link](N)) 26
COMPARAISON DE COMPLEXITÉ DE DIFFÉRENTES
METHODES DE TRIS

27

Vous aimerez peut-être aussi