elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  [Source] cPushSort
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Source] cPushSort  (Leído 1,798 veces)
BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
[Source] cPushSort
« en: 27 Septiembre 2011, 04:33 am »

.
Esta clase solo sive para agregar elementos y buscar dichos elementos de la manera ams rapida posible que con un simple array y un simple for next.

* Permite Agregar un array long (Se puede mejorar el algoritmo respecto a esto, pero lo deje asi.).
* Permite agregar Elementos Unicos en el momento que se desee.
* Retorna la posicion (IndexOf) si se encuentra de lo contrario retorna un valor constante INVALIDVALUEARRAY.
* Permite consultar X elemento ( GetElement).
* Permite eliminar X elemento segun su indice ( Remove(); posiblemente se tenga que buscar primero con IndexOf() ).
* Retorna la cantidad de elementos.
* Tiene una tasa de BUSQUEDA MUY RAPIDA.

Código
  1.  
  2. '
  3. '   /////////////////////////////////////////////////////////////
  4. '   //                                                         //
  5. '   // Autor:   BlackZeroX ( Ortega Avila Miguel Angel )       //
  6. '   //                                                         //
  7. '   // Web:     http://InfrAngeluX.Sytes.Net/                  //
  8. '   //                                                         //
  9. '   //    |-> Pueden Distribuir Este Codigo siempre y cuando   //
  10. '   // no se eliminen los creditos originales de este codigo   //
  11. '   // No importando que sea modificado/editado o engrandesido //
  12. '   // o achicado, si es en base a este codigo                 //
  13. '   /////////////////////////////////////////////////////////////
  14.  
  15. Option Explicit
  16.  
  17. Private lMem()          As Long
  18. Private lCount          As Long
  19. Private bDuplicate      As Boolean
  20.  
  21. Public Sub clear()
  22.    Erase lMem()
  23.    lCount = 0
  24. End Sub
  25.  
  26. Public Property Get Count() As Long
  27.    Count = lCount
  28. End Property
  29.  
  30. '   //  Retorna la cantidad de elementos restantes.
  31. Public Function Remove(ByVal lIndex As Long) As Long
  32.    Remove = RemoveInArrayLong(lIndex, lMem())
  33. End Function
  34.  
  35. Public Property Get DuplicateElements() As Boolean
  36.    DuplicateElements = bDuplicate
  37. End Property
  38.  
  39. Public Property Let DuplicateElements(ByVal bBool As Boolean)
  40.    bDuplicate = bBool
  41. End Property
  42.  
  43. '   //  Agrega un array a la coleccion y retorna la cantidad de elementos agregados a ella.
  44. Public Function AddArray(ByRef lArray() As Long) As Long
  45. Dim i                   As Long
  46. Dim c                   As Long
  47.    If Not (ItsArrayINI(VarPtrA(lArray))) Then Exit Function
  48.    c = lCount
  49.    For i = LBound(lArray()) To UBound(lArray())
  50.        Me.Add lArray(i)
  51.    Next
  52.    AddArray = (lCount - c) '   //  Cantidad de elementos REALMENTE AGREGADOS: es igual a la direfencia del valor anterior y el actual de lCount.
  53. End Function
  54.  
  55. '   //  Inserta en el Array el elemento Dado de manera Ascendente.
  56. '   //  Agrega lVal en la coleccion de manera ordenada, y retorna el indice de su hubicacion.
  57. '   //  Se retorna el indice de la hubicacion (...cambia este indice si se agrega otro y es menor a este...).
  58. Public Function Add(ByVal lVal As Long) As Long
  59. Dim lRetPos             As Long
  60.    '   //  Buscamos la posicion en donde insertar...
  61.    If ExitsInArray(lVal, lMem(), lRetPos) And Not bDuplicate Then Exit Function
  62.    ReDim Preserve lMem(lCount)
  63.    lCount = (lCount + 1)
  64.    If ((lCount - 1) - lRetPos) Then '   //  Recorremos a la derecha TODOS los elementos.
  65.        CopyMemory VarPtr(lMem(lRetPos + 1)), VarPtr(lMem(lRetPos)), ((lCount - lRetPos) * &H4)
  66.    End If
  67.    lMem(lRetPos) = lVal
  68.    Add = lRetPos
  69. End Function
  70.  
  71. '   //  Obtenemos una copia de la coleccion de elementos.
  72. Public Function GetArray() As Long()
  73.    GetArray = lMem()
  74. End Function
  75.  
  76. Public Function IndexOf(ByVal lVal As Long) As Long
  77.    If Not ExitsInArray(lVal, lMem, IndexOf) Then IndexOf = INVALIDVALUEARRAY
  78. End Function
  79.  
  80. Public Function GetElement(ByVal lIndex As Long) As Long
  81.    If (lIndex < lCount) Then GetElement = lMem(lIndex)
  82. End Function
  83.  
  84. Private Function ExitsInArray(ByRef lVal As Long, ByRef lArray() As Long, ByRef lRetPos As Long) As Boolean
  85. Dim lLIndex                 As Long
  86. Dim lUIndex                 As Long
  87. Dim iSortType               As Long
  88.  
  89.    If Not (ItsArrayINI(VarPtrA(lArray))) Then lRetPos = 0: Exit Function
  90.  
  91.    lLIndex = LBound(lArray())
  92.    lUIndex = UBound(lArray())
  93.  
  94.    If (lArray(lUIndex) < lArray(lLIndex)) Then
  95.        SwapLong lLIndex, lUIndex
  96.        iSortType = 1
  97.    End If
  98.  
  99.    If (lVal < lArray(lLIndex)) Then
  100.        lRetPos = lLIndex
  101.    ElseIf (lVal = lArray(lLIndex)) Then
  102.        lRetPos = lLIndex
  103.        ExitsInArray = True
  104.    Else
  105.        If (lVal > lArray(lUIndex)) Then
  106.            lRetPos = lUIndex
  107.        ElseIf (lVal = lArray(lUIndex)) Then
  108.            lRetPos = lUIndex
  109.            ExitsInArray = True
  110.        Else
  111.            Do Until ExitsInArray
  112.                lRetPos = ((lLIndex + lUIndex) \ 2)
  113.                If ((lRetPos <> lLIndex) And (lRetPos <> lUIndex)) Then
  114.                    If (lArray(lRetPos) < lVal) Then
  115.                        lLIndex = lRetPos
  116.                    ElseIf (lArray(lRetPos) > lVal) Then
  117.                        lUIndex = lRetPos
  118.                    ElseIf (lArray(lRetPos) = lVal) Then
  119.                        ExitsInArray = True
  120.                    End If
  121.                Else
  122.                    Exit Do
  123.                End If
  124.            Loop
  125.        End If
  126.    End If
  127.  
  128.    If Not (ExitsInArray) Then              '   //  Obtenemos la posicion donde deberia estar dicho elemento.
  129.        If (iSortType = 1) Then
  130.            If (lArray(lRetPos) > lVal) Then lRetPos = (lRetPos - 1)
  131.        Else
  132.            If (lArray(lRetPos) < lVal) Then lRetPos = (lRetPos + 1)
  133.        End If
  134.    End If
  135.  
  136. End Function
  137.  
  138. Private Sub Class_Terminate()
  139.    Call Me.clear
  140. End Sub
  141.  
  142.  

En un Modulo...
Código
  1.  
  2. Option Explicit
  3.  
  4. Public Const INVALIDVALUEARRAY As Long = (-1)
  5.  
  6. Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal pDest As Long, ByVal pSrc As Long, ByVal ByteLen As Long)
  7. Public Declare Function VarPtrA Lib "msvbvm60.dll" Alias "VarPtr" (ByRef Ptr() As Any) As Long
  8.  
  9. Public Function ItsArrayINI(ByVal lngPtr As Long, Optional LnBytes As Long = 4) As Boolean
  10. Dim lng_PtrSA                   As Long
  11.    If ((lngPtr <> 0) And (LnBytes > 0)) Then
  12.        Call CopyMemory(ByVal VarPtr(lng_PtrSA), ByVal lngPtr, LnBytes)
  13.        ItsArrayINI = (Not (lng_PtrSA = 0))
  14.    End If
  15. End Function
  16.  
  17. Public Sub SwapLong(ByRef lVal1 As Long, ByRef lval2 As Long)
  18.    lval2 = lval2 Xor lVal1
  19.    lVal1 = lVal1 Xor lval2
  20.    lval2 = lval2 Xor lVal1
  21. End Sub
  22.  
  23. '   //  Return (Cantidad de elementos).
  24. Public Function RemoveInArrayLong(ByVal lIndex As Long, ByRef lArray() As Long) As Long
  25.    If (ItsArrayINI(VarPtrA(lArray)) = True) Then
  26.        RemoveInArrayLong = UBound(lArray)
  27.        If Not ((lIndex < 0) Or (lIndex > RemoveInArrayLong)) Then
  28.            If Not (lIndex = RemoveInArrayLong) Then
  29.                Call CopyMemory(ByVal VarPtr(lArray(lIndex)), ByVal VarPtr(lArray(lIndex + 1)), (RemoveInArrayLong - lIndex) * 4)
  30.            End If
  31.            If ((RemoveInArrayLong - 1) > INVALIDVALUEARRAY) Then
  32.                ReDim Preserve lArray(RemoveInArrayLong - 1)
  33.            Else
  34.                Erase lArray()
  35.            End If
  36.        End If
  37.    End If
  38. End Function
  39.  
  40.  

Temibles Lunas!¡.


En línea

The Dark Shadow is my passion.
raul338


Desconectado Desconectado

Mensajes: 2.633


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: [Source] cPushSort
« Respuesta #1 en: 27 Septiembre 2011, 14:12 pm »

Se ve bien, aunque, utilizas InsertionSort no?

Podrías aplicar un proceso de ordenado para hacerlo "personalizable" (ej, que llame a un evento para indicar cual es "mayor" o "menor" y pasarle punteros a clases o tipos :P)


En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [Source] cPushSort
« Respuesta #2 en: 27 Septiembre 2011, 19:53 pm »

Por eso es OpenSource!¡.

Dulces Lunas!¡.
En línea

The Dark Shadow is my passion.
BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [Source] cPushSort
« Respuesta #3 en: 7 Octubre 2011, 20:10 pm »

Se ve bien, aunque, utilizas InsertionSort no?

Si a mi modo pero si es ese xP

Dulces Lunas!¡.
En línea

The Dark Shadow is my passion.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
CS2 SOURCE CODE
Juegos y Consolas
vicecity 4 4,148 Último mensaje 5 Enero 2004, 17:02 pm
por Korben Wallace
CS Source!!!
Juegos y Consolas
Gust Over 2 2,850 Último mensaje 27 Junio 2005, 15:08 pm
por Sagman
CS Source En Red
Juegos y Consolas
Ciku 4 3,442 Último mensaje 19 Agosto 2007, 15:57 pm
por Ciku
CS source y 1.6
Juegos y Consolas
Juanlu 2 2,783 Último mensaje 18 Junio 2007, 12:19 pm
por kek_500
source de *.exe
Ingeniería Inversa
saliaz 4 4,112 Último mensaje 28 Septiembre 2008, 21:14 pm
por saliaz
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines