Function SortQuickSortDIM2(tbl, Optional Sortmode As Long = 1, Optional Gauche = -1, Optional Droite = -1) ' Quick sort
Dim ref, G&, D&, temp1, First
If Droite = -1 And Gauche = -1 Then First = 1 Else First = 0
Droite = IIf(Droite = -1, UBound(tbl), Droite)
Gauche = IIf(Gauche = -1, LBound(tbl), Gauche)
ref = tbl((Gauche + Droite) \ 2, 1) 'le pivot( change de position au fur et a mesure)
G = Gauche: D = Droite 'on dédouble les variable gauche et droite pour l'incrémentation dans les deux do/loop droite et gauche
Do
Select Case Sortmode
Case xlDescending, 1
Do While tbl(G, 1) < ref: G = G + 1:: Loop 'on comptabilise le passage
Do While ref < tbl(D, 1): D = D - 1: Q = Q + 1:: Loop 'on comptabilise le passage
Case xlAscending, 2
Do While tbl(G, 1) > ref: G = G + 1:: Loop 'on comptabilise le passage
Do While ref > tbl(D, 1): D = D - 1: Q = Q + 1:: Loop 'on comptabilise le passage
Case Else
MsgBox "l'argument SortMode peut prendre 2 valeurs xlascending ou 2 / xldescending ou 1)": SortQuickSortDIM2 = tbl: Exit Function
End Select
'intervertion des itemS tbl(G) à gauche du pivot et l'item tbl(d) à droite du pivot
If G <= D Then
temp1 = tbl(G, 1): tbl(G, 1) = tbl(D, 1): tbl(D, 1) = temp1
G = G + 1: D = D - 1
ch = ch + 1
End If
Loop While G <= D
'si g ou gauche est plus petit on relance un appel de la fonction (c'est la récursivité)
If G < Droite Then x = SortQuickSortDIM2(tbl, Sortmode, G, Droite)
If Gauche < D Then x = SortQuickSortDIM2(tbl, Sortmode, Gauche, D)
'pour économiser un peu la charge memoire du return de la fonction on la charge dès que l'on revients à first
'c'est à dire quand il n'y a plus d'appel récursifs
If First = 1 Then SortQuickSortDIM2 = tbl
End Function