Indexer un tri de tableau

Dans certaines circonstances, il est nécessaire de ne pas trier le tableau originel mais d’indexer le tri dans un tableau secondaire.
Voici la fonction de tri indexé avec Shellsort…

'ShellsortIndex - Philben - v1.0 - 03/2012
'Utilisable pour des tailles de tableau jusqu'à 10 000 000
'Les valeurs des gaps au-dessus de 1750 sont extrapolées et ne sont certainement pas les plus efficaces !
'Si le type de tableau est Integer, modifier :
'  - ByRef a() As Long     en ByRef a() As Integer
'  - Dim ref As Long       en Dim ref As Integer
Public Function ShellSortIndex(ByRef a() As Long, ByRef Idx() As Long, ByVal lowerBound As Long, ByVal upperBound As Long)
   Dim ref As Long
   Dim h As Long, i As Long, j As Long, k As Long, l As Long, m As Long, n As Long, refIdx As Long, g As Variant
 
   ReDim Idx(lowerBound To upperBound)
   For i = lowerBound To upperBound: Idx(i) = i: Next i
 
   g = Array(1, 4, 10, 23, 57, 132, 301, 701, 1750, 4376, 10941, 27353, 68383, 170958, 427396, 1068491, 2671228)
   n = upperBound - lowerBound + 1
 
   l = LBound(g)
   If n < g(UBound(g)) Then
      k = l
      While g(k + 1) < n: k = k + 1: Wend
   Else
      k = UBound(g)
   End If
 
   While k >= l
      h = g(k)
      m = lowerBound + h
      For i = m To upperBound
         ref = a(Idx(i))
         refIdx = Idx(i)
         j = i
         Do While ref < a(Idx(j - h))   '< pour un tri croissant, sinon >
           Idx(j) = Idx(j - h)
            j = j - h
            If j < m Then Exit Do
         Loop
         Idx(j) = refIdx
      Next i
      k = k - 1
   Wend
End Function

Le tableau Idx() contient l’ordre des valeurs du tableau a().
Par exemple, Les valeurs triées sont obtenues par :

   For i = LBound(Idx) To UBound(Idx)
      Debug.Print a(Idx(i))
   Next i

Remarque
Le tri par index est moins rapide que le tri du tableau lui-même. Compter 40 à 50% de temps en plus.

Laisser un commentaire