J’ai 0,31 cf post 371avec la partie temp je te l'ai dis je suis 0.70/0.80
je les ai testé toutes les 3
celle de hier reste ta meilleure
Quelque part sur ce que j'ai fait c'est une sorte d'insertion trié propre à chaque ensemble qui ont une partie commune fait sur une boucle avant le tri finalau lieu de basculer vers un tri par insertion qui devient alors le plus performant.
oui j'ai fait un tableau supp ou je ne mets que les clé, je tri ce tableau supp avec le même fonction et grace au clé je récupère le n° de ligne pour remettre tous les arrays dans l'ordreje pense avoir pigé un peu le principe
Tu l’as testé ?? pour voir si cela réduit le temps aussi de ton côté … ?je garde celle d'hier quand même
C'est pourtant évident: à partir de 2 éléments rangés dans l'ordre on a une partie déjà classée dans laquelle on peut faire une recherche dichotomique pour savoir où insérer le 3ième, et ainsi de suite. Ça économise les comparaisons mais pas les déplacements. C'est pour ça que le gain de temps se gâte pour des morceaux au delà d'une quarantaine d'éléments, mais bien plus, vers le millier, si on peut utiliser le MoveMemory pour les effectuer.comment utiliser la recherche dichotomique et quel est l'intérêt de l'utiliser pour trier un tableau désordoné
Hello Patrickbonjour ryu
je crois avoir compris pourquoi chez toi c'est plus rapide
en fait j'ai testé deux listes de nombre
liste 1 > 10 000 items de 1 à 30 000 donc les nombres ne se suivent pas forecement
liste 2 > 10 000 items de 1 à 10 000 dans le désordre
Oui c'est clair@Dranreb ok je comprends le raisonnement
mais pour le mettre en oeuvre ouf !
C'est dans le cas de 2 éléments rangés, mais comment fais ton pour savoir qu'il y en a déjà 2 d'éléments rangésà partir de 2 éléments rangés dans l'ordre on a une partie déjà classée dans laquelle on peut faire une recherche dichotomique pour savoir où insérer le 3ième, et ainsi de suite.
For R = Min + 1 To Max: Arg = TDon(R)
Mn = Min: Mx = R
Do: S = (Mn + Mx) \ 2
If TDon(S) <= Arg Then Mn = S + 1 Else Mx = S
Loop Until Mx <= Mn
For S = R To Mn + 1 Step -1: TDon(S) = TDon(S - 1): Next S
TDon(S) = Arg
Next R
Private Sub PartitAmél(TDon(), ByVal Min As Long, ByVal Max As Long)
Dim VPiv, Crs As Long, Dcr As Long, V, _
R As Long, Arg, Mn As Long, Mx As Long, S As Long
If Max - Min > 20 Then
VPiv = TDon(Min + Int(Rnd * (Max - Min + 1)))
Crs = Min: Dcr = Max
Do While Crs <= Dcr
Do While TDon(Crs) < VPiv: Crs = Crs + 1: Loop
Do While VPiv < TDon(Dcr): Dcr = Dcr - 1: Loop
If Crs <= Dcr Then
V = TDon(Crs): TDon(Crs) = TDon(Dcr): TDon(Dcr) = V
Crs = Crs + 1: Dcr = Dcr - 1
End If
Loop ' While Crs <= Dcr
If Crs < Max Then PartitAmél TDon, Crs, Max
If Min < Dcr Then PartitAmél TDon, Min, Dcr
Else
For R = Min + 1 To Max: Arg = TDon(R)
Mn = Min: Mx = R
Do: S = (Mn + Mx) \ 2
If TDon(S) <= Arg Then Mn = S + 1 Else Mx = S
Loop Until Mx <= Mn
For S = R To Mn + 1 Step -1: TDon(S) = TDon(S - 1): Next S
TDon(S) = Arg
Next R
End If
End Sub