Vous êtes sur la page 1sur 37

Tris.

organiser une collection selon un ordre dtermin

relation dordre : comparaison de cls

tri par comparaison versus tri par indexation tri sur place : espace mmoire de taille constante tri stable : prserve lordre en cas dgalit

p. 1/3

Tris.
1. Tris en O(n2 ). tri bulles, tri par insertion, tri par slection. 2. Tris en O(n log n). tri par fusion, tri par tas, tri rapide (mais en O(n2 ) dans le pire des cas). 3. Tris spciaux. tri shell (probablement O(n1.25 )), tri par dnombrement (O(n)).

p. 2/3

Tri par insertion


partie trie

partie non trie

On insre dans la partie trie en recopiant les lments vers la droite.

p. 3/3

Tri par insertion

procdure TriParInsertion(E) (InOut : E la suite (e1 , . . . , en ))


dbut pour

i := 2 jusqu n faire j := i, v := ei , tant que ((j > 1) et (v < ej1 )) faire ej := ej1 , j := j 1,
n faire

ej := v,
n faire n procdure

p. 4/3

Tri par insertion


Pire des cas : i 1 changes chaque fois.
n

T (n) =
i=2

i = O(n2 )

Meilleur des cas : aucun change (mais une comparaison).


n

T (n) =
i=2

1 = O(n)

p. 5/3

Arbre de dcision du tri par insertion.


1 2 3

a b c e1 <= e2 a b c <= a b c > a c b <= a c b > c a b e2 <= e3 <= > e1 > e2 b a c <= > e2 > e3

b a c

b c a <= b c a > c b a

p. 6/3

Arbre de dcision.
Nombre de feuilles : n! le nombre de permutations de n lments Hauteur minimale de larbre = longueur de la plus longue branche n h log(n!) log( )n e (formule de Stirling) or n log( )n = n log n n log e e et la hauteur de larbre h = O(n log n) Conclusion : la complexit dun tri par comparaison est au moins O(n log n)

p. 7/3

Tas (les de priorit)


Tas : arbre binaire dont chaque noeud a une valeur suprieure
(resp. infrieure) aux valeurs gurant dans ses sous-arbres
0 13

hauteur log2 n

1 11 3 10 4 3 8 8 9 2 5 5

2 7 6 1

7 4

p. 8/3

Tas : reprsentation
Tas binaire cod dans un tableau : n noeuds dans les n premires cases

Dans un tableau commenant lindice 0 : ls gauche de i : (2 i + 1), ls droit de i : (2 i + 2)

Cest donc un arbre quilibr (longueurs des branches gales un noeud prs)

fils droit
0 1 2 3 4 5 5 1 6 7 4 8 8 9 2 n 10 11 0 5 13 11 7 10 3

fils gauche

p. 9/3

Tas : ls gauche, ls droit.

fonction FilsG(i) renvoyer (2 i + 1),

fonction FilsD(i) renvoyer (2 i + 2),

p. 10/3

Tas : entasser.
0

Tas
1

Tas
2

11
3 4 5

7
6

10
7 8 9

3 8 2

p. 11/3

Tas : entasser.

9 7

11 10 4 8 2 3 5

p. 12/3

Tas : entasser.

11 7

9 10 4 8 2 3 5

p. 13/3

Tas : entasser.

11 7

9 10 4 8 2 3 5

p. 14/3

Tas : entasser.

11 7

10 9 4 8 2 3 5

p. 15/3

Tas : entasser.

11 7

10 9 4 8 2 3 5

p. 16/3

Tas : entasser.
procdure Entasser(i, T, n) {FilsG(i) et FilsD(i) sont des tas, i peut-tre pas}
dbut

iM ax := i, si (FilsG(i) < n) et (T [FilsG(i)] > T [iM ax]) alors iM ax := FilsG(i), si (FilsD(i) < n) et (T [FilsD(i)] > T [iM ax]) alors iM ax := FilsD(i), si (iM ax = i) alors Echanger(T, i, iM ax), Entasser(iM ax, T, n),
n procdure

Pire des cas : parcours de la plus longue branche O(log2 n).

p. 17/3

Tas : construction.
Principe : transformer en tas du bas vers le haut en entassant
0 1 3 7 8 9 4 10 11 5 12 13

2 6 14

15 16 17 18 19 20 21 22

23 24 25

rduits une feuille, pas la peine dentasser

p. 18/3

Tas : construction.
Base : les n/2 derniers lments du tableau sont des tas (feuilles) Itration : FilsG(i) et FilsD(i) sont des tas, aprs Entasser(i, T, n), i est un tas

procdure ConstruireUnTas(T, n) {Inout : T un tableau de n lments}


dbut pour

i := n/2 1 jusqu 0 faire Entasser(i, T, n),

n procdure

Complexit :

O(nlogn) de faon vidente. En fait O(n).

p. 19/3

Tas : construction.
Preuve construction du tas en O(n)

n la hauteur h = 0 au plus 21 noeuds n la hauteur h = 1 au plus 22 noeuds n la hauteur h au plus 2h+1 noeuds

Pour un noeud la hauteur h on entasse en au plus h changes

p. 20/3

Tas : construction.
Preuve construction du tas en O(n) Le cumul est
log n

h=0

n 2h+1

log n

hn
h=0

h 2h

Puisque

i=0

x ix = (1 x)2
i

on a
h=0

1/2 h = =2 h 2 2 (1 1/2)

p. 21/3

Tas : construction.
Preuve construction du tas en O(n) et donc le nombre dchanges est born par
log n

n
h=0

h 2 n = O(n) h 2

p. 22/3

Tri par tas.

Principe : extraire successivement tous les lments du tas.

Initialisation : construire un tas avec la suite trier. Itration : extraire le plus grand (qui se trouve au sommet du tas) le remplacer par le dernier lment du tas rtablir la proprit de tas en entassant

p. 23/3

Tri par tas.


32 26 17 16 3 19 21 11 13 28 2

p. 24/3

Tri par tas.


11 26 17 16 3 19 21 13 28 2

32

p. 25/3

Tri par tas.


28 26 17 16 3 19 21 11 13 2

32

p. 26/3

Tri par tas.


19 26 17 16 3 21 11 13 2

28 32

p. 27/3

Tri par tas.


26 21 17 16 3 19 11 13 2

28 32

p. 28/3

Tri par tas.


3 21 17 16 19 11 13 2

26 28 32

p. 29/3

Tri par tas.

procdure TriParTas(T, n) {In : T un tableau de n lments}


dbut

ConstruireUnTas(T, n), pour i := n 1 jusqu 1 faire Echanger(T [0], T [i]), Entasser(0, T, i),
n procdure

ConstruireUnTas(T, n) est en O(n). Ensuite on fait n 1 fois Entasser(0, T, i), i.e. O(nlogn). La complexit du tri est donc O(nlogn).

p. 30/3

Tri par dnombrement.


Tri sans comparaison Suppose que lon sait indexer les lments trier :
i.e. affecter chacun un rang qui dpends uniquement de sa valeur qui respecte lordre Exemple : tri dune suite de valeurs entires comprises entre 1 et 1000

p. 31/3

Tri par dnombrement.


fonction TriParDenombrements(T, n) {In : T un tableau de n lments} {Out : R le tableau tri des lments de T }
dbut

i := 1 k faire N b[i] := 0, pour i := 1 n faire N b[T [i]] := N b[T [i]] + 1, N b[k] := n N b[k] + 1, pour i := k 1 1 faire N b[i] := N b[i + 1] N b[i], pour i := 1 n faire R[N b[T [i]]] := T [i], N b[T [i]] := N b[T [i]] + 1, renvoyer R
pour n procdure

initialisations calcul des nombres dapparitions calcul des indices du premier lment de chaque catgorie recopie des lment originaux du tableau T dans R

Complexit : O(n + k). Il est donc linaire.

p. 32/3

Tri par dnombrement.

10

3
1

2
2

2
3

Nombres dapparitions Indices des premiers placer placement de T[1] en R[1] placement de T[2] en R[8] placement de T[3] en R[2]

3
1

4
2

3
3

10

1 2 2 3

4 4 4 4

8 8
R 1
1

1
2

1
3

2
4

2
5

2
6

2
7

3
8

3
9

3
10

9 9

p. 33/3

Tri par base.


Utilise le tri par dnombrement en plusieurs passes.
536 893 427 167 853 592 197 462 592 462 893 853 536 427 167 197 427 536 853 462 167 592 893 197 167 197 427 462 536 592 853 893

n nombres c chiffres de k valeurs possibles. Complexit O(c n + c k). Si c est constant et si k = O(n) le tri par base est linaire (O(n)).

p. 34/3

Tri shell.

Lide : h-ordonner la suite laide dun tri par insertion pour diffrentes valeurs de h
On prendra par exemple n/3, n/9,. . .,1

La suite E = (e1 , . . . , en ) est h-ordonne si i, i n h, ei ei+h , Si h vaut 1 alors la suite est trie.

p. 35/3

Tri shell.

procdure TriShell(e1 , . . . , en )
dbut

h := 1, h n/9 faire h := 3 h + 1, tant que h > 0 faire {Tri par insertion pour h-ordonner E} pour i := h + 1 jusqu n faire j := i, v := ei , tant que ((j > h) et (v < ejh )) faire ej := ejh , j := j h, ej := v, h := h/3,
tant que n procdure

p. 36/3

Tri shell.

h = . . . , 1093, 364, , 121, 40, 13, 4, 1. Cette suite permet de confronter tous les lments entres eux rapidement

Complexit (conjectures) : O(n (logn)2 ) ou n1,25 . Moins de n1,5 comparaisons dans tous les cas.

p. 37/3