Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: BlackZeroX en 28 Octubre 2009, 23:31 pm



Título: [Source] Ordenar Array (Low y Fast)
Publicado por: BlackZeroX en 28 Octubre 2009, 23:31 pm
Versión Lenta... Fue sacado del ListBoxEx de LeandroAscierto, con una modificación para pasar el array en la funcion.

Código
  1. Option Explicit
  2.  
  3. Public Enum EnuListOrder
  4.    AcendetOrder = 0
  5.    DecendentOrder = 1
  6. End Enum
  7.  
  8. Public Sub Sorted(ByRef Item(), Optional Order As EnuListOrder = DecendentOrder)
  9.    Dim Itm As String
  10.    Dim J As Double
  11.    Dim i As Double
  12.    Dim mcount As Long
  13.    mcount = UBound(Item)
  14.  
  15.    If Order = AcendetOrder Then
  16.        For J = 0 To mcount
  17.            For i = 0 To mcount
  18.                If Item(i) > Item(i + 1) Then
  19.                    Itm = Item(i + 1)
  20.                    Item(i + 1) = Item(i)
  21.                    Item(i) = Itm
  22.                End If
  23.            Next i
  24.        Next J
  25.    Else
  26.        For J = 0 To mcount - 2
  27.            For i = 0 To mcount - 2
  28.                If Item(i) < Item(i + 1) Then
  29.                    Itm = Item(i + 1)
  30.                    Item(i + 1) = Item(i)
  31.                    Item(i) = Itm
  32.                End If
  33.            Next i
  34.        Next J
  35.    End If
  36. End Sub
  37.  


El siguiente es una versión mejorada por un Servidor... ordena adecuadamente los numeros ( Antes 0, 1, 10, 100,1000, ahora 0,1,2,3,4,5 ), Es muchas veces mas rapido que el anterior y más largo el codigo...

Código
  1. '
  2. '   /////////////////////////////////////////////////////////////
  3. '   // Autor Algoritmo: C.A.R. Hoare en 1960                   //
  4. '   // Autor:   BlackZeroX ( Ortega Avila Miguel Angel )       //
  5. '   //                                                         //
  6. '   // Web:     http://InfrAngeluX.Sytes.Net/                  //
  7. '   //                                                         //
  8. '   //    |-> Pueden Distribuir Este Codigo siempre y cuando   //
  9. '   // no se eliminen los creditos originales de este codigo   //
  10. '   // No importando que sea modificado/editado o engrandesido //
  11. '   // o achicado, si es en base a este codigo                 //
  12. '   /////////////////////////////////////////////////////////////
  13.  
  14. Option Explicit
  15. Enum EnuListOrder
  16.    AcendetOrder = 0
  17.    DecendentOrder
  18. End Enum
  19. Private Sub AuxOrden(ByRef mArray(), _
  20.                    i As Long, j As Long, _
  21.                    il As Long, jl As Long)
  22. Dim c                                       As String
  23. Dim c2                                      As Long
  24.    c = mArray(j)
  25.    mArray(j) = mArray(i)
  26.    mArray(i) = c
  27.    c2 = il
  28.    il = -jl
  29.    jl = -c2
  30. End Sub
  31. Private Sub PreSort(ByRef mArray(), lb As Long, ub As Long, _
  32.                    k As Long, _
  33.            Optional Order As EnuListOrder = DecendentOrder)
  34. Dim i                                       As Long
  35. Dim j                                       As Long
  36. Dim il                                      As Long
  37. Dim jl                                      As Long
  38.    il = 0: jl = -1
  39.    i = lb: j = ub
  40.    While i < j
  41.        If Order = DecendentOrder Then
  42.            If IsNumeric(mArray(i)) And IsNumeric(mArray(j)) Then
  43.                If Val(mArray(i)) > Val(mArray(j)) Then
  44.                    Call AuxOrden(mArray(), i, j, il, jl)
  45.                End If
  46.            Else
  47.                If mArray(i) > mArray(j) Then
  48.                    Call AuxOrden(mArray(), i, j, il, jl)
  49.                End If
  50.            End If
  51.        Else
  52.            If IsNumeric(mArray(i)) And IsNumeric(mArray(j)) Then
  53.                If Val(mArray(i)) < Val(mArray(j)) Then
  54.                    Call AuxOrden(mArray(), i, j, il, jl)
  55.                End If
  56.            Else
  57.                If mArray(i) < mArray(j) Then
  58.                    Call AuxOrden(mArray(), i, j, il, jl)
  59.                End If
  60.            End If
  61.        End If
  62.        i = i + il
  63.        j = j + jl
  64.    Wend
  65.    k = i
  66. End Sub
  67. Private Sub QSort(ByRef mArray(), lb As Long, ub As Long, _
  68.                Optional Order As EnuListOrder = DecendentOrder)
  69. Dim k                                   As Long
  70.    If lb < ub Then
  71.        PreSort mArray, lb, ub, k, Order
  72.        Call QSort(mArray, lb, k - 1, Order)
  73.        Call QSort(mArray, k + 1, ub, Order)
  74.    End If
  75. End Sub
  76. Public Sub Start_QuickSort(ByRef mArray(), _
  77.                Optional Order As EnuListOrder = DecendentOrder)
  78.    If (Not (mArray)) = -1 Then Exit Sub ' Es para ver si esta inicializado el Arreglo
  79.    QSort mArray, LBound(mArray), UBound(mArray), DecendentOrder
  80. End Sub
  81.  

Ejemplo de Uso o llamda:

Código
  1. Option Explicit
  2. Private Sub Form_Load()
  3.      Dim i As Integer
  4.      Dim mArray(200)
  5.      For i = 0 To 100
  6.          Randomize
  7.          mArray(i) = i
  8.      Next i
  9.      For i = 101 To 200
  10.          Randomize
  11.          mArray(i) = Chr(Round(64 * Rnd()) + 65)
  12.      Next i
  13.      Start_QuickSort mArray, DecendentOrder
  14.      For i = 0 To 200
  15.          Debug.Print mArray(i)
  16.      Next i
  17. End Sub
  18.  

Dulces Lunas!¡.


Título: Re: [Source] Ordenar Array (Low y Fast)
Publicado por: BlackZeroX en 29 Octubre 2009, 00:09 am
Disculpen el Doble post.

PAra el Primero:

http://www.conclase.net/c/orden/burbuja.html

Para quien desee saber mas sobre el Segundo metodo de ORdenamiento:

http://www.conclase.net/c/orden/quicksort.html

Otros:

http://www.conclase.net/c/orden/index.html

Dulces Lunas!¿.


Título: Re: [Source] Ordenar Array (Low y Fast)
Publicado por: LeandroA en 29 Octubre 2009, 05:20 am
muy bueno!!! es mucho mas complicado entenderlo pero en fin es mucho mas rapido no estoy muy seguro pero creo que hay una forma mas rapida aun utilizando CallWindowProc  que masomenos es lo que utilizan los listview pero bueno la verdad ni idea como.


saludos.


Título: Re: [Source] Ordenar Array (Low y Fast)
Publicado por: ssccaann43 © en 29 Octubre 2009, 18:05 pm
Muy bueno el ejemplo brother! :D