Vous êtes sur la page 1sur 9

T RI RAPIDE

Quicksort ? IFT2010 H2006 ? UdeM ? Miklós Csűrös


Tri
Entrée : tableau A[] de données comparables (interface Comparable en Java)

On veut trier le tableau

Solutions :

• tri par sélection (selection sort)


• tri par insertion (insertion sort)
• tri par fusion (Mergesort)
• tri par tas (Heapsort)
• tri rapide (Quicksort)

Quicksort ? IFT2010 H2006 ? UdeM ? Miklós Csűrös 1


Tri (cont)
tableau A[0..n − 1]

Tri par sélection :


pour i ← 0, . . . , n − 1 faire A[0..i − 1] contient les i éléments les plus petits de
A, triés

Tri par insertion :


pour i ← 0, . . . , n − 1 faire A[0..i − 1] contient les i premiers éléments de A,
triés

Quicksort ? IFT2010 H2006 ? UdeM ? Miklós Csűrös 2


Tri par sélection
(«Tri A» au début du cours)

Algo T RI - SELECTION(A[0..n − 1])


S1 pour i ← 0, 1, . . . , n − 2 faire
S2 minidx ← i
S3 pour j ← i + 1, . . . , n − 1 faire
S4 si A[j] < A[minidx] alors minidx ← j
// (maintenant A[minidx] = min{A[i], . . . , A[n − 1]})
S5 si i 6= minidx alors échanger A[i] et A[minidx]

Complexité
comparaison d’éléments [ligne TS4] (n − 1) + (n − 2) + · · · 1 = n(n−1)
2 fois ;
échange d’éléments [ligne TS5] ≤ (n − 1) fois

Temps de calcul : Θ(n2) pour tout A

Quicksort ? IFT2010 H2006 ? UdeM ? Miklós Csűrös 3


Tri par insertion
Algo T RI - INSERTION(A[0..n − 1])
I1 pour i ← 1, 2, . . . , n − 1 faire
I2 j←i
I3 tandis que j ≥ 0 et A[j] < A[i] faire
I4 échanger A[i] et A[j]
I5 j ←j−1

Complexité — dépend de l’ordre des éléments au début


meilleur cas (déjà trié) : n − 1 comparaisons et aucun échange
pire cas (trié en ordre décroissant) : n(n−1)
2 comparaisons et échanges
moyen cas : Θ(n2)

Quicksort ? IFT2010 H2006 ? UdeM ? Miklós Csűrös 4


Tri par fusion
(«Tri B» au début du cours)

Algo M ERGE S ORT(A[0..n − 1])


M1 si n < 2 alors retourner A
M2 B1 ← T RI - FUSION(A[0..bn/2c − 1])
M3 B2 ← T RI - FUSION(A[bn/2c..n − 1])
M4 B ← F USION(B1, B2)
M5 retourner B

Complexité Θ(n log n) mais on a besoin d’un espace auxiliaire de taille n pour la
fusion

Quicksort ? IFT2010 H2006 ? UdeM ? Miklós Csűrös 5


Tri par tas
(on utilise un max-monceau)

H EAP S ORT(A) // vecteur non-trié A[1..n]


H1 heapify(A)
H2 for i ← |A|, . . . 2 do
H3 échanger A[1] ↔ A[i]
H4 C OULER(A[1], 1, A[1..i − 1])

Temps Θ(n log n) dans tous les cas, sans espace additionnelle !

Quicksort ? IFT2010 H2006 ? UdeM ? Miklós Csűrös 6


Tri rapide
1. choisir un élément ( pivot ), le placer dans sa case finale i, mettre tous les éléments
inférieurs en A[0..i − 1] et tous les éléments supérieurs en A[i + 1..n − 1]

pivot = 5 4 2 8 1 3 5 1 7 2 6 8 9

échanger 4 2 8 1 3 9 1 7 2 6 8 5

échanger 4 2 2 1 3 9 1 7 8 6 8 5

fin de balayer 4 2 2 1 3 1 9 7 8 6 8 5

remettre 4 2 2 1 3 1 5 7 8 6 8 9
le pivot

2. trier A[0..i − 1] et A[i + 1..n − 1] (récurrence)

Quicksort ? IFT2010 H2006 ? UdeM ? Miklós Csűrös 7


Tri rapide (cont)
Temps de calcul : Θ(n log n) en moyen si le pivot est bien choisi ; Θ(n2) en
pire cas

Choix du pivot : médiane de trois (A[0], A[n − 1] et A[bn/2c]) ou aléatoire

Il est mieux d’utiliser tri par insertion quand n ≤ 5..20

Quicksort ? IFT2010 H2006 ? UdeM ? Miklós Csűrös 8

Vous aimerez peut-être aussi