Hola amigos tengo esta rutina de ordenamiento que me funciona perfecto le paso una array como referencia separado con coma (,) como este:
9,1,6,13,11,21,39,31,38,48,57,54,63,79,65 y me devuelve esto:
1\6\9\11\13\21\31\38\39\48\54\57\63\65\79que estaría perfecto para algunos casos Ahora necesito modificar esa rutina para que me ordene de forma progresiva de a decenas pero de manera aleatoria por los numeros de cada decena, (complicado de explicar) vamos a un ejemplo:
necesitaria que me devuelva algo como esto :
1\9\6\13\11\21\38\31\39\48\54\57\63\65\79
o
9\6\1\11\13\21\31\38\39\48\54\57\63\65\79
o
6\1\9\11\13\21\31\38\39\48\54\57\63\65\79
Ordenados en grupos de decenas pero mezclados dentro de cada decena!!!!
Esta es el procedimiento que estoy usando!
Public Sub OrdenarArray(ByRef pvarArray As Variant, Optional ByVal plngLeft As Long, Optional ByVal plngRight As Long)
Dim lngFirst As Long
Dim lngLast As Long
Dim varMid As Variant
Dim lngIndex As Long
Dim varSwap As Variant
Dim a As Long
Dim b As Long
Dim c As Long
If plngRight = 0 Then
plngLeft = LBound(pvarArray)
plngRight = UBound(pvarArray)
End If
lngFirst = plngLeft
lngLast = plngRight
lngIndex = plngRight - plngLeft + 1
a = Int(lngIndex * Rnd) + plngLeft
b = Int(lngIndex * Rnd) + plngLeft
c = Int(lngIndex * Rnd) + plngLeft
If CByte(pvarArray(a)) <= CByte(pvarArray(b)) And CByte(pvarArray(b)) <= CByte(pvarArray(c)) Then
lngIndex = b
Else
If CByte(pvarArray(b)) <= CByte(pvarArray(a)) And CByte(pvarArray(a)) <= CByte(pvarArray(c)) Then
lngIndex = a
Else
lngIndex = c
End If
End If
varMid = pvarArray(lngIndex)
Do
Do While CByte(pvarArray(lngFirst)) < CByte(varMid) And CByte(lngFirst) < CByte(plngRight)
lngFirst = lngFirst + 1
Loop
Do While CByte(varMid) < CByte(pvarArray(lngLast)) And CByte(lngLast) > CByte(plngLeft)
lngLast = lngLast - 1
Loop
If lngFirst <= lngLast Then
varSwap = CByte(pvarArray(lngFirst))
pvarArray(lngFirst) = CByte(pvarArray(lngLast))
pvarArray(lngLast) = CByte(varSwap)
lngFirst = lngFirst + 1
lngLast = lngLast - 1
End If
Loop Until lngFirst > lngLast
If (lngLast - plngLeft) < (plngRight - lngFirst) Then
If plngLeft < lngLast Then OrdenarArray pvarArray, plngLeft, lngLast
If lngFirst < plngRight Then OrdenarArray pvarArray, lngFirst, plngRight
Else
If lngFirst < plngRight Then OrdenarArray pvarArray, lngFirst, plngRight
If plngLeft < lngLast Then OrdenarArray pvarArray, plngLeft, lngLast
End If
End Sub
desde yá muchas gracias!!!
