Re,re
avec ta premiere version et ma insertionbubbleGD
je suis decendu a 0.40/0.45
VB:'****************************************************************************************************************************************************** ' __ _ _ _ _ _ _ _ _______ ___ ___ _ ___ _ ____ _______ ____ ' // \\ // // // // /\\ // // // // \\ // || // // || /\\ // // // ' //__// \\// // // //__\ // // // // // // || // // || //__\ // // //__ ' // \\ // // // // \\ // // // // // // // // // // // \\ // // // '// // // //__// // ////__// // \\__// //___// // //___// // ////___ // //___ '****************************************************************************************************************************************************** 'méthode 6 'Auteur: Ryuautodidacte et patricktoulon sur ExcelDownloads 'version1 1.0 'réécrite en une seule fonction par patricktoulon 'insertion des code sortinsertbubble intra code ' cette fonction reside sur le fait d'utiliser un object collection qui va contenir dans les valeur un array de chaine similaire 'ou commencant par les meme caractères 'ensuite on va trier chaque sub array avec la méthode sortinsertbubble de patricktoulon 'ensuite on va refaire une passe sortinserbubble sur le TAg général (qui contioent des sub arrary) 'et le trier par la valeur du premier item de chaque array 'et pour finir on recompile les sub array dans un seul tableau (celui d'origine ) ' 'vous l'avez compris on est dans la catégorie de fonction de tri dite "Diviser pour mieux reigner" 'en effet les boucles sont moins longues et plus rapide a trier 'mis apart l'object collection on est tres proche de la méthode fusion coisée avec l'insertion '***************************************************************************************************** Option Base 1 Dim Q Dim ch Sub test() Dim TB, tim# Q = 0: ch = 0 TB = Cells(1).CurrentRegion.Value Cells(1, 3).Resize(UBound(TB)).ClearContents tim = Timer TB = SortRyuPatKey(TB) MsgBox Format(Timer - tim, "#0.00") & " sec" & vbCrLf & Q & " TOURS DE BOUCLE" & vbCrLf & ch & " INTERVERTIONS" Cells(1, 3).Resize(UBound(TB)) = (TB) End Sub Function SortRyuPatKey(TB) Dim TA(), SortColl As New Collection, GetTA, Tmps!, L, a&, b&, x&, ref, SubTB, SubTBA, D&, W& For Each t In TB ReDim NewTB(1 To 1) L = Mid(t, 1, Len(t) - 1): S = Len(t): cle = L & "|" & S On Error Resume Next SortColl.Add IIf(SortColl.Count = 0, 1, SortColl.Count + 1), cle If Err Then GetTA = TA(SortColl(cle)): ReDim Preserve GetTA(1 To UBound(GetTA) + 1): GetTA(UBound(GetTA)) = t: TA(SortColl(cle)) = GetTA Else ReDim Preserve TA(1 To SortColl.Count): TA(SortColl(cle)) = Array(t) End If Next 'tri SortInsertBubbleGD des sub array dans l'array TA For i = 1 To UBound(TA) SubTB = TA(i) For a = LBound(SubTB) To UBound(SubTB) ref = SubTB(a) x = a D = UBound(TA) W = (UBound(TA) - a) / 2 For b = a + 1 To (UBound(SubTB) - W) Q = Q + 1 If ref > SubTB(b) Then ref = SubTB(b): x = b: If ref > SubTB(D) Then ref = SubTB(D): x = D: D = D - 1 Next b If x <> a Then TP = SubTB(a): SubTB(a) = SubTB(x): SubTB(x) = TP: ch = ch + 1 Next a TA(i) = SubTB Q = Q + 1 Next ' second tri sortinsertbubble sur le TA genéral ' le tri va se faire sur le premier item de chaque array dans subTBA SubTBA = TA For a = LBound(SubTBA) To UBound(SubTBA) ref = SubTBA(a)(1) x = a For b = a + 1 To (UBound(SubTBA)) Q = Q + 1 If ref > SubTBA(b)(1) Then ref = SubTBA(b)(1): x = b: Next b If x <> a Then TP = SubTBA(a): SubTBA(a) = SubTBA(x): SubTBA(x) = TP: ch = ch + 1 Next a TA = SubTBA ReDim TB(1 To 1) n = 0 For Each arr In TA Q = Q + 1 ReDim Preserve TB(1 To n + UBound(arr)) For i = 1 To UBound(arr) Q = Q + 1 TB(i + n) = arr(i) Next n = UBound(TB) Next SortRyuPatKey = Application.Transpose(TB) End Function
oui les tris lents sont moins à la traine comme çamais c'est une belle performence et c'est tout nouveau tout beau
Option Base 1
Dim Q
Dim ch
Sub testQSort()
Dim TB, TA(), SortColl As New Collection, GetTA, tim!, Mn
Cells(1, 3).Resize(10000).ClearContents
Q = 0: ch = 0: tim = Timer
n = 1: ReDim temp(1 To 1)
TB = Cells(1).CurrentRegion.Value
For Each T In TB
ReDim NewTB(1 To 1)
L = Mid(T, 1, Len(T) - 1): S = Len(T): cle = L & S
On Error Resume Next
SortColl.Add IIf(SortColl.Count = 0, 1, SortColl.Count + 1), cle
If Err Then
GetTA = TA(SortColl(cle)): ReDim Preserve GetTA(1 To UBound(GetTA) + 1): GetTA(UBound(GetTA)) = T: TA(SortColl(cle)) = GetTA
Else
ReDim Preserve TA(1 To SortColl.Count): TA(SortColl(cle)) = Array(T): ReDim Preserve temp(1 To n): temp(n) = CLng(cle)
n = UBound(temp) + 1
End If
Next
temp = sortInsertBubble3(temp)
ReDim TB(1 To UBound(temp))
For i = 1 To UBound(temp)
TB(i) = TA(SortColl(CStr(temp(i))))
Next
For i = 1 To UBound(TB): TB(i) = sortInsertBubble3(TB(i)): Q = Q + 1:: Next
ReDim TA(1 To 1)
n = 0
For Each arr In TB
Q = Q + 1
ReDim Preserve TA(1 To n + UBound(arr))
For i = 1 To UBound(arr)
Q = Q + 1
TA(i + n) = arr(i)
Next
n = UBound(TA)
Next
MsgBox Format(Timer - tim, "#0.00") & " sec" & vbCrLf & Q & " TOURS DE BOUCLE" & vbCrLf & ch & " INTERVERTIONS"
Cells(1, 3).Resize(UBound(TA)) = Application.Transpose(TA)
End Sub
Function sortInsertBubble3(T)
Dim A&, B&, C&, x&, ref
For A = LBound(T) To UBound(T)
ref = T(A)
x = A
C = UBound(T)
W = (UBound(T) - A) / 2
'Dans une seule boucle B avance de A+1 vers le ubound et C recule du ubound vers B
' quand les deux se rencontrent on arrete de boucler
' on fait donc la moitié du nombre de tours de la hybride 1
For B = A + 1 To UBound(T) - W
Q = Q + 1
If ref > T(B) Then ref = T(B): x = B:
If ref > T(C) Then ref = T(C): x = C:
C = C - 1
Next
If T(x) < T(A) Then TP = T(A): T(A) = T(x): T(x) = TP: ch = ch + 1
Next A
sortInsertBubble3 = T
End Function
reoui les tris lents sont moins à la traine comme ça
qd on passe de 7 - 8 secondes à 0,40 c'est vraiment énorme !!!
n = 1: ReDim temp(1 To 1)
TB = Cells(1).CurrentRegion.Value
For Each T In TB
ReDim NewTB(1 To 1)
L = Mid(T, 1, Len(T) - 1): S = Len(T): cle = L & S
On Error Resume Next
SortColl.Add IIf(SortColl.Count = 0, 1, SortColl.Count + 1), cle
If Err Then
GetTA = TA(SortColl(cle)): ReDim Preserve GetTA(1 To UBound(GetTA) + 1): GetTA(UBound(GetTA)) = T: TA(SortColl(cle)) = GetTA
Else
ReDim Preserve TA(1 To SortColl.Count): TA(SortColl(cle)) = Array(T): ReDim Preserve temp(1 To n): temp(n) = CLng(cle)
n = UBound(temp) + 1
End If
Next
temp = sortInsertBubble3(temp)
ReDim TB(1 To UBound(temp))
For i = 1 To UBound(temp)
TB(i) = TA(SortColl(CStr(temp(i))))
Next
For i = 1 To UBound(TB): TB(i) = sortInsertBubble3(TB(i)): Q = Q + 1:: Next