???Autre chose qui me dérange (vrai ou faux pb ?), c'est d'avoir 'DicoC.OverWrit = True' (ou même pour le cumule) en début de code qui agit de manière globale et non sélective …
Dans une même procédure, il peut y avoir des conditions où l'overwrite et/ou le cumule peuvent s'appliquer ou non selon les cas …
C'est bien pour ça que je demandais la version d'Excel …par contre sur windows variable tableau 1 dim ou 2 dim limite pareille 65536
Sub test()
Dim t(), maxi&, plage As Range
Randomize
maxi = 65536
'maxi = Rows.Count'débloquer cette ligne pour aller plus loin
Set plage = Cells(1, 1).Resize(maxi)
ReDim Preserve t(1 To maxi, 1 To 1)
For i = 1 To UBound(t)
t(i, 1) = Int(1 + (Rnd * (maxi + 1)))
Next
t(Int(1 + (Rnd * (maxi))), 1) = "toto" ' on met "toto" au hasard dans le tableau
plage.Value = t
x = Application.Match("toto", plage, 0)
MsgBox "toto en ligne : " & x
x = Application.Match("toto", t, 0)
MsgBox "toto en ligne : " & x
End Sub
Sub RemplirTriCroissant()
Dim Ta As Variant
Dim Tb() As Variant
Dim Tc() As Variant
ReDim Tc(1 To 1)
Dim lastRow As Long
Dim i As Long
' Nettoie la colonne C où le tableau trié sera affiché
Range(Cells(1, 3), Cells(Cells(65536, 3).End(xlUp).Row, 3)).Clear
' Charger les données de la colonne Excel dans le tableau Ta
Ta = Range(Cells(1, 1), Cells(Cells(Rows.Count, 1).End(xlUp).Row, 1))
' Mesure le temps de tri
tt = Timer()
' Trouver la dernière ligne avec des données dans la colonne
lastRow = UBound(Ta, 1)
' Trouver la plus petite valeur dans le tableau Ta
' minValeur = Application.WorksheetFunction.Min(Ta) <====== NON
' Trouver la plus grande valeur dans le tableau Ta
maxValeur = Application.WorksheetFunction.Max(Ta)
' Redimensionner Tb pour correspondre à la taille de maxValeur
ReDim Tb(1 To maxValeur)
' Copier les données de Ta vers Tb
For i = 1 To lastRow
Tb(Ta(i, 1)) = Ta(i, 1)
Next i
' Copier les données de Tb vers Tc (sans les vides)
For i = 1 To maxValeur
If Tb(i) <> Empty Then
Tc(UBound(Tc)) = Tb(i)
ReDim Preserve Tc(1 To UBound(Tc) + 1)
End If
Next i
MsgBox Timer() - tt
' Affiche le tableau trié en ordre croissant dans la colonne C
Cells(1, 3).Resize(UBound(Tc), 1) = Application.WorksheetFunction.Transpose(Tc)
' ' Afficher les données de Tb dans la fenêtre immédiate pour vérification (facultatif)
' For i = LBound(Tc) To UBound(Tc)
' Debug.Print Tc(i)
' Next i
End Sub
OK, … mdr … celui ci avait besoin d'être corrigé aussiheu ryu il faut suivre
je parle de son quicksort à rallonge ici
Sub RemplirTriCroissant()
Dim Ta As Variant
Dim Tb() As Variant
Dim Tc() As Variant
ReDim Tc(1 To 1)
Dim lastRow As Long
Dim i As Long
' Nettoie la colonne C où le tableau trié sera affiché
Range(Cells(1, 3), Cells(Cells(65536, 3).End(xlUp).Row, 3)).Clear
' Charger les données de la colonne Excel dans le tableau Ta
Ta = Range(Cells(1, 1), Cells(Cells(Rows.Count, 1).End(xlUp).Row, 1))
' Mesure le temps de tri
tt = Timer()
' Trouver la dernière ligne avec des données dans la colonne
lastRow = UBound(Ta, 1)
' Trouver la plus petite valeur dans le tableau Ta
minValeur = Application.WorksheetFunction.Min(Ta)
' Trouver la plus grande valeur dans le tableau Ta
maxValeur = Application.WorksheetFunction.Max(Ta)
' Redimensionner Tb pour correspondre à la taille de Ta
ReDim Tb(minValeur To maxValeur)
' Copier les données de Ta vers Tb
For i = 1 To lastRow
Tb(Ta(i, 1)) = Ta(i, 1)
Next i
' Copier les données de Tb vers Tc (sans les vides)
For i = minValeur To maxValeur
If Tb(i) <> Empty Then
Tc(UBound(Tc)) = Tb(i)
ReDim Preserve Tc(1 To UBound(Tc) + 1)
End If
Next i
MsgBox Timer() - tt
' Affiche le tableau trié en ordre croissant dans la colonne C
Cells(1, 3).Resize(UBound(Tc), 1) = Application.WorksheetFunction.Transpose(Tc)
' ' Afficher les données de Tb dans la fenêtre immédiate pour vérification (facultatif)
' For i = LBound(Tc) To UBound(Tc)
' Debug.Print Tc(i)
' Next i
End Sub
Heu non pas vraiment car là tu parlais de tri (même si on parlait pas du même code car je pensais que tu parlais de de celui-ci …) ce code est plus rapide que le QuickSort pour les entierson s’égare un peu là
@laurent950 tu me le corrige ou pas ton quicksort modulé ?
Sub TestQuickSortCroissant()
Dim t() As Variant
Range(Cells(2, 3), Cells(Cells(65536, 3).End(xlUp).Row, 3)).Clear
t = Range(Cells(2, 1), Cells(Cells(65536, 1).End(xlUp).Row, 1))
tt = Timer()
IntroSort t
MsgBox Timer() - tt
' Afficher le tableau tris Croissant
Cells(2, 3).Resize(UBound(t, 1), UBound(t, 2)) = t
'Dim i As Long
'For i = LBound(t) To UBound(t)
'Debug.Print t(i)
'Next i
End Sub
Sub IntroSort(arr() As Variant)
Dim low As Long, high As Long
low = LBound(arr)
high = UBound(arr)
IntroSortRecursive arr, low, high, 2 * Log2(high - low + 1)
End Sub
Sub IntroSortRecursive(arr() As Variant, ByVal low As Long, ByVal high As Long, ByVal maxDepth As Long)
If high <= low Then Exit Sub
If maxDepth = 0 Then
' Si la profondeur maximale est atteinte, utilisez un algorithme de tri plus simple (par exemple, le tri par insertion).
InsertionSort arr, low, high
Else
Dim pivotIndex As Long
pivotIndex = PartitionCroissant(arr, low, high)
IntroSortRecursive arr, low, pivotIndex - 1, maxDepth - 1
IntroSortRecursive arr, pivotIndex + 1, high, maxDepth - 1
End If
End Sub
Function PartitionCroissant(arr() As Variant, ByVal low As Long, ByVal high As Long) As Long
Dim pivot As Variant
pivot = arr(low, 1)
Dim i As Long
Dim j As Long
i = low
j = high + 1
Do
Do
i = i + 1
On Error Resume Next
Loop While arr(i, 1) < pivot And i <= high
On Error GoTo 0
Do
j = j - 1
Loop While arr(j, 1) > pivot
If i < j Then
' Échanger les éléments
Dim temp As Variant
temp = arr(i, 1)
arr(i, 1) = arr(j, 1)
arr(j, 1) = temp
End If
Loop While i < j
' Échanger pivot avec l'élément à la position j
arr(low, 1) = arr(j, 1)
arr(j, 1) = pivot
PartitionCroissant = j
End Function
Sub InsertionSort(arr() As Variant, ByVal low As Long, ByVal high As Long)
Dim i As Long, j As Long
For i = low + 1 To high
j = i
While j > low And arr(j, 1) < arr(j - 1, 1)
Swap arr(j, 1), arr(j - 1, 1)
j = j - 1
Wend
Next
End Sub
Sub Swap(ByRef a As Variant, ByRef b As Variant)
Dim temp As Variant
temp = a
a = b
b = temp
End Sub
Function Log2(ByVal x As Double) As Long
Log2 = WorksheetFunction.RoundDown(Log(x) / Log(2), 0)
End Function
Sub TestQuickSortDecroissant()
Dim t() As Variant
Range(Cells(2, 3), Cells(Cells(65536, 3).End(xlUp).Row, 3)).Clear
t = Range(Cells(2, 1), Cells(Cells(65536, 1).End(xlUp).Row, 1))
tt = Timer()
IntroSort t
MsgBox Timer() - tt
' Afficher le tableau tris Croissant
Cells(2, 3).Resize(UBound(t, 1), UBound(t, 2)) = t
'Dim i As Long
'For i = LBound(t) To UBound(t)
'Debug.Print t(i)
'Next i
End Sub
Sub IntroSort(arr() As Variant)
Dim low As Long, high As Long
low = LBound(arr)
high = UBound(arr)
IntroSortRecursive arr, low, high, 2 * Log2(high - low + 1)
End Sub
Sub IntroSortRecursive(arr() As Variant, ByVal low As Long, ByVal high As Long, ByVal maxDepth As Long)
If high <= low Then Exit Sub
If maxDepth = 0 Then
' Si la profondeur maximale est atteinte, utilisez un algorithme de tri plus simple (par exemple, le tri par insertion).
InsertionSort arr, low, high
Else
Dim pivotIndex As Long
pivotIndex = PartitionDecroissant(arr, low, high)
IntroSortRecursive arr, low, pivotIndex - 1, maxDepth - 1
IntroSortRecursive arr, pivotIndex + 1, high, maxDepth - 1
End If
End Sub
Function PartitionDecroissant(arr() As Variant, ByVal low As Long, ByVal high As Long) As Long
Dim pivot As Variant
pivot = arr(low, 1)
Dim i As Long
Dim j As Long
i = low
j = high + 1
Do
Do
i = i + 1
On Error Resume Next
Loop While arr(i, 1) > pivot And i <= high ' Changer pour le tri décroissant
On Error GoTo 0
Do
j = j - 1
Loop While arr(j, 1) < pivot
If i < j Then
' Échanger les éléments
Dim temp As Variant
temp = arr(i, 1)
arr(i, 1) = arr(j, 1)
arr(j, 1) = temp
End If
Loop While i < j
' Échanger pivot avec l'élément à la position j
arr(low, 1) = arr(j, 1)
arr(j, 1) = pivot
PartitionDecroissant = j
End Function
Sub InsertionSort(arr() As Variant, ByVal low As Long, ByVal high As Long)
Dim i As Long, j As Long
For i = low + 1 To high
j = i
While j > low And arr(j, 1) < arr(j - 1, 1)
Swap arr(j, 1), arr(j - 1, 1)
j = j - 1
Wend
Next
End Sub
Sub Swap(ByRef a As Variant, ByRef b As Variant)
Dim temp As Variant
temp = a
a = b
b = temp
End Sub
Function Log2(ByVal x As Double) As Long
Log2 = WorksheetFunction.RoundDown(Log(x) / Log(2), 0)
End Function
Sub CreerDesordreTotal()
Dim tableau(1 To 64000) As String
Dim i As Long
Dim nom As String
' Remplissage du tableau avec une séquence de noms
For i = 1 To 64000
nom = "Nom" & Format(i, "00000")
tableau(i) = nom
Next i
' Mélanger le tableau pour créer un désordre total
Randomize
For i = 1 To 64000
' Échanger chaque élément avec un autre élément aléatoire
Dim temp As String
Dim j As Long
j = Int((64000 - i + 1) * Rnd + i)
temp = tableau(i)
tableau(i) = tableau(j)
tableau(j) = temp
Next i
' Clear
Range(Cells(2, 1), Cells(UBound(tableau) + 1, 1)).Clear
' Afficher quelques éléments du tableau pour vérification
For i = LBound(tableau) To UBound(tableau)
Cells(i + 1, 1) = tableau(i)
Next i
' Pour test resultat
'For i = 1 To 20
'Debug.Print tableau(i)
'Next i
Dim Q
Dim ch
Sub qqq()
ReDim t(1 To 15000, 1 To 1)
For i = 1 To 15000
t(i, 1) = Int(1 + (Rnd * 30000))
Next
With Cells(1, 1).Resize(15000)
.Value = t
.RemoveDuplicates Columns:=1, Header:=xlNo
End With
Cells(10001, 1).Resize(5000).ClearContents
End Sub
Sub test()
Dim t, tim#
t = Application.Transpose([A1:A10000].Value)
tim = Timer
t = sortInsertBubble(t)
MsgBox Format(Timer - tim, "#0.00 ""sec""") & vbCrLf & Q & " tours" & vbCrLf & ch & " intervertions"
Cells(1, 3).Resize(10000).Value = Application.Transpose(t)
End Sub
Function sortInsertBubble(t)
Dim A&, B&, C&, X&
For A = LBound(t) To UBound(t)
ref = t(A)
X = A
For B = A + 1 To UBound(t)
Q = Q + 1
If ref > t(B) Then ref = t(B): X = B
Next B
If X <> A Then tp = t(A): t(A) = t(X): t(X) = tp: ch = ch + 1
Next A
sortInsertBubble = t
End Function