Le fait d’utiliser le tri par sélection lorsqu’on arrive à des morceaux de tableaux petits réduit le nombre de comparaisons et de permutations d’élément par rapport à un QuickSort complet, mais n’implique pas forcemment un gain de rapidité. Faites des tests sur vos données pour choisir d’utiliser ou non le tri par sélection et choisir le seuil (typiquement entre 3 et 5). Ce choix est particulièrement intéressant lorsque les comparaisons entre les données du tableau sont longues (ex: chaines).
Exemple en Delphi (Pascal) :
AlxQuickSort.pas
type TDonnee=Integer; //type de donnée à traiter, à modifier selon l’utilisation.
procedure alxQuickSort(var T: array of TDonnee);
begin
alxQuickSort_(T, Low(T), High(T));
end;
procedure alxQuickSort_(var T: array of TDonnee; debut, fin: Integer);
var petit, grand:Integer; moyen, temp:TDonnee;
begin
repeat //cf plus bas....
if (fin-debut)<=4 then //si le segment du tableau est trop petit, utilise SelectionSort
begin //4 est la valeur de seuil la plus efficace en général.
//Si les données sont trés similaires (ex: array[1..1000]of 1..9), 3 est plus efficace
selectionSort_(T,debut,fin);
petit:=fin; //pour sortir du repeat //exit;
end
else
begin
petit:=debut; //les pointeurs d’indice de gauche et de droite
grand:=fin;
moyen:=T[(debut+fin) div 2]; //élément du milieu comme pivot
repeat
while T[petit]<moyen do Inc(petit);
while T[grand]>moyen do Dec(grand);
if petit<=grand then //dès que 2 éléments se trouvent du mauvais côté
begin //du pivot, ils sont permuttés
temp:=T[petit]; //permutte les éléments
T[petit]:=T[grand];
T[grand]:=temp;
Inc(petit);
Dec(grand);
end;
{else if petit = grand then //si on veut réduire le nombre de permutations
begin //perte d’efficacité due aux tests fréquents petit = grand
Inc(petit);
Dec(grand);
end;}
until petit>grand;
//dès que les indices petit et grand se rencontrent, chaque moitié est envoyée à QuickSort
//ici, la 2ème moitié est traitée par le repeat pour éviter une récursive
if grand>debut then alxQuickSort_(T, debut, grand);
debut:=petit; //....le repeat..until.....
end;
until petit>=fin //.....remplace: if petit<fin then alxQuickSort_(T, petit, fin);
//supprime une récursive=gain mémoire
end;
procedure selectionSort_(var T: array of TDonnee; const debut, fin: Integer);
var petit, grand:Integer; temp:TDonnee;
begin
for petit:=debut to Pred(fin) do
for grand:=fin downto Succ(petit) do
if T[petit]>T[grand] then
begin
temp:=T[petit];
T[petit]:=T[grand];
T[grand]:=temp;
end;
end;