Le tri shaker
Le tri "Shaker", également appelé tri "Cocktail", tri "Shuttle", tri "boustrophédon"
ou tri à bulles bidirectionnel est une variante du tri à bulles .
Son principe est identique à celui du tri à bulles, sauf qu'il change de direction à chaque passe. C'est une légère amélioration car il permet non seulement aux plus grands
éléments de migrer vers la fin de la série mais également aux plus petits éléments de migrer vers le début.
L'animation ci-après détaille le fonctionnement du tri shaker :
Démonstration du tri shaker
PROCEDURE tri_shaker ( TABLEAU a[ 1 : n] )
sens ← 'avant', debut ← 1, fin ← n-1, en_cours ← 1
REPETER
permut ← FAUX
REPETER
SI a[en_cours] > a[en_cours + 1] ALORS
echanger a[en_cours] et a[en_cours + 1]
permut ← VRAI
FIN SI
SI (sens='avant') ALORS
en_cours ← en_cours + 1
SINON
en_cours ← en_cours - 1
FIN SI
TANT QUE ( (sens='avant') ET (en_cours<fin)) OU ( (sens= 'arriere) ET (en_cours>debut))
SI (sens='avant') ALORS
sens ← 'arriere'
fin ← fin - 1
SINON
sens ← 'avant'
debut ← debut + 1
FIN SI
TANT QUE permut = VRAI
FIN PROCEDURE
let tri_shaker tableau =
let permutation = ref true and en_cours = ref 0 and sens = ref 1
and debut
= ref 0 and fin
= ref ( ( Array . length tableau
) - 2 ) in
while ( ! permutation = true ) do
permutation := false ;
while ( ( ! sens= 1 ) && ( ! en_cours < ! fin) ) || ( ( ! sens = - 1 ) && ( ! en_cours > ! debut) ) do
en_cours := ! en_cours + ! sens;
if tableau. ( ! en_cours) > tableau. ( ! en_cours + 1 ) then
begin
(* On echange les deux elements *)
permutation := true ;
let temp = tableau. ( ! en_cours) in
begin
tableau. ( ! en_cours) <- tableau. ( ! en_cours + 1 ) ;
tableau. ( ! en_cours + 1 ) <- temp;
end
end
done ;
if ( ! sens = 1 ) then fin := ! fin - 1 else debut := ! debut + 1 ;
sens := - ! sens;
done ;
tableau;;
type tab = array [ 1 ..20 ] of integer ;
procedure tri_shaker( var tableau : tab) ;
var permutation : boolean ;
en_cours, temp : integer ;
sens : integer ;
debut, fin : integer ;
begin
en_cours:= 1 ;sens:= 1 ;
debut:= 0 ;fin:= 20 ;
REPEAT
permutation := false ;
while ( ( en_cours<fin) and ( sens= 1 ) ) or
( ( sens=- 1 ) and ( en_cours>debut) ) do
begin
en_cours:= en_cours+ sens;
if tableau[ en_cours] <tableau[ en_cours- 1 ] then
begin
temp:= tableau[ en_cours] ;
tableau[ en_cours] := tableau[ en_cours - 1 ] ;
tableau[ en_cours - 1 ] := temp;
permutation:= true ;
end ;
end ;
if sens= 1 then fin:= fin - 1 else debut:= debut + 1 ;
sens:=- sens;
UNTIL ( not permutation) ;
end ;
def tri_shaker( tableau) :
permutation,sens,en_cours = True ,1 ,0
debut,fin = 0 ,len ( tableau) -2
while permutation == True :
permutation = False
while ( en_cours< fin and sens==1 ) or \
( en_cours> debut and sens==-1 ) :
# Test si echange
if tableau[ en_cours] > tableau[ en_cours + 1 ] :
permutation = True
# On echange les deux elements
tableau[ en_cours] , tableau[ en_cours + 1 ] = \
tableau[ en_cours + 1 ] ,tableau[ en_cours]
en_cours = en_cours + sens
# On change le sens du parcours
if sens==1 :
fin = fin - 1
else :
debut = debut + 1
sens = -sens
return tableau
typedef int bool;
enum { false , true } ;
void tri_shaker( int * tableau) {
bool permutation;
int en_cours= 0 , sens= 1 ;
int debut= 1 , fin= 19 ;
do {
permutation= false ;
while ( ( ( sens== 1 ) && ( en_cours< fin) ) || ( ( sens==- 1 ) && ( en_cours> debut) ) ) {
en_cours += sens;
if ( tableau[ en_cours] < tableau[ en_cours- 1 ] ) {
int temp = tableau[ en_cours] ;
tableau[ en_cours] = tableau[ en_cours- 1 ] ;
tableau[ en_cours- 1 ] = temp;
permutation= true ;
}
}
if ( sens== 1 ) fin--; else debut++;
sens = - sens;
} while ( permutation) ;
}
Si on retient la méthode du tri shaker pour le petit jeu page précédente , on a :
Comparaisons :
Déplacements :
Mélanger
Résoudre
Complexité du tri shaker
Dans le meilleur des cas, avec des données déjà triées, l'algorithme ne parcourer qu'une seule fois le tableu en n'effectuant seulement que n - 1 comparaisons.
Sa complexité dans le meilleur des cas est donc linéaire, en Θ(n ).
Complexite du tri shaker dans le meilleur des cas
Nombre d'opérations
Nombre d'elements à trier
Θ(n)
Dans le pire des cas, avec des données triées à l'envers, on a une complexité du tri shaker en Θ(n 2 ).
Complexite du tri shaker le pire des cas
Nombre d'opérations
Nombre d'elements à trier
Θ(n2)
Si tous les éléments de la série à trier sont distincts et que toutes leurs permutations sont équiprobables,
la complexité du tri shaker est également en Θ(n 2 )
Complexite du tri shaker en moyenne
Nombre d'opérations
Nombre d'elements à trier
Θ(n2)