Autor Tema: rutina de Ordenamiento un poco especial  (Leído 3683 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Bazooka

  • Terabyte
  • *****
  • Mensajes: 951
  • Reputación: +31/-20
  • El pibe Bazooka
    • Ver Perfil
    • Desof sistemas
rutina de Ordenamiento un poco especial
« en: Abril 19, 2011, 08:04:06 am »
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\79

que 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!


Código: [Seleccionar]
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!!! :)

« última modificación: Abril 25, 2011, 08:20:00 pm por xkiz ™ »
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Bazooka

  • Terabyte
  • *****
  • Mensajes: 951
  • Reputación: +31/-20
  • El pibe Bazooka
    • Ver Perfil
    • Desof sistemas
Re: rutina de Ordenamiento un poco especial
« Respuesta #1 en: Abril 25, 2011, 12:42:20 am »
parece complicada la cosa nadie me tira una piola.....
« última modificación: Abril 25, 2011, 08:20:29 pm por xkiz ™ »
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

wolf_kof

  • Visitante
Re:rutina de Ordenamiento un poco especial
« Respuesta #2 en: Abril 25, 2011, 11:00:52 pm »
io si te entendi que es lo que quieres!! pero la verdad!! no le encuentro sentido!! si tienes la cadena desordenada es para ordenarla no para medio ordenarla!! aparte que no muxo tengo experiencia con vectores y matrices pero deja investigo un poco y hago uno q otro ejercicio y a ver si te puedo ayudar

Bazooka

  • Terabyte
  • *****
  • Mensajes: 951
  • Reputación: +31/-20
  • El pibe Bazooka
    • Ver Perfil
    • Desof sistemas
Re:rutina de Ordenamiento un poco especial
« Respuesta #3 en: Abril 25, 2011, 11:30:36 pm »
Gracias wolf_kof puede parecer sin sentido por que no conoces el contecto en el que se aplica. pero es así tal como lo plantee al ejercicio es como si tendrias 10 cajas una por cada decena y debo ordenar las cajas pero no los numeros que estan dentro de ellas.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Juan Luis López

  • Bytes
  • *
  • Mensajes: 30
  • Reputación: +2/-0
  • No nos mires ¡UNETE!
    • Ver Perfil
    • #spanishrevolution
Re:rutina de Ordenamiento un poco especial
« Respuesta #4 en: Mayo 08, 2011, 11:41:13 pm »
No se lo que quieres hacer XD
Pero yo crearía un procedimiento que recorra la matriz con un for y que coja los datos de 3 en 3 y que luego los cambie al modo que quieres.
seria algo asi:

Código: [Seleccionar]
Seleccionardatos()
dim m as integer
dim primerdato as integer
dim segundodato as integer
dim tercerdato as integer

for m = 0 to matriz(indexdelultimodato) step 3
      primerdato= matriz(m)
      segundodato = matriz (m+1)
      tercerdato= matriz(m+2)
      OrdenarComotuQuieres(primerdato,SegundoDato,tercerDato)
next m

Y luego el procedimeinto OrdenarComoTuquieres(dato1 as integer,dato2 asinteger, dato3 as integer)

no lo he probado porke no se exactamente lo que quieres(de hecho lo he escrito directamente en el post.

Espero haberte ayudado.

Juan Luis

« última modificación: Mayo 08, 2011, 11:47:01 pm por Juan Luis López »
Juventud SIN futuro. Sin casa, sin curro, sin pensión, ¡Sin miedo!

czar9

  • Kilobyte
  • **
  • Mensajes: 64
  • Reputación: +4/-4
    • Ver Perfil
Re:rutina de Ordenamiento un poco especial
« Respuesta #5 en: Mayo 16, 2011, 03:51:43 am »
Hola antes que nada acá te presento una idea que te podría ayudar.
Si lo que quieres es separar los datos en decenas puedes hacer un ciclo sobre tu arreglo y hacer una división entera sobre cada dato en tu arreglo esto te dará la decena a la que pertenece por ejemplo  0,1,2,3,4,5,6,7,8,9 pertenecen ala "decena" 0 ya que cualquier   0-9 \ 10 =0. lastima que en vb6 no tienes matrices asociativas ( no se si existan)  pero quizás puedas usar las estructuras de datos para hacerlo =) y hacer extender el limite ya que  el código que te pongo esta limitado a ordenarte números  del  0-109  tomando como criterio a que decena pertenecen

Este código te pongo es para ejemplificar como puede ser una solución. no he leído el código que tu pones así que si suena esto incoherente  ya sabemos por que =) utilizo una arreglo de string (a falta de diseñar una estructura de datos)  para ir guardando los números que si te das cuenta no son ordenados ni aleatorios mas bien se van agregando conforme su lugar en el arrreglo, pero teniendo por decenas ya puedes implementar otro algoritmo que los mueva aleatoriamente.

Código: [Seleccionar]
Private Sub Form_Load()
Dim ordenados(10) As String
Dim numero(10) As Integer
numero(0) = 9
numero(1) = 6
numero(2) = 12
numero(3) = 1
numero(4) = 3
numero(5) = 5
numero(6) = 17
numero(7) = 25
numero(8) = 15
numero(9) = 23
numero(10) = 2

For i = 0 To 10
 decena = numero(i) \ 10
 ordenados(decena) = ordenados(decena) + Str(numero(i)) + ", "
Next i

For i = 0 To 10
 If ordenados(i) <> "" Then
  MsgBox ordenados(i)
 End If
Next i

End Sub

Saludos espero te sirva y me gustaría mucho pusieras en contexto para que es que sirve esto en la vida practica por favor :P.