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

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  Orderar Matriz utilizando CopyMemory en un solo bucle?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Orderar Matriz utilizando CopyMemory en un solo bucle?  (Leído 2,077 veces)
LeandroA
Moderador
***
Desconectado Desconectado

Mensajes: 760


www.leandroascierto.com


Ver Perfil WWW
Orderar Matriz utilizando CopyMemory en un solo bucle?
« en: 15 Noviembre 2008, 17:54 pm »

Buenas intento ordenar una matriz alfabeticamente a medida se se van agregando datos a esta, pero no me esta resultando, la idea seria....
(por ejemplo) si el dato ingresado es menor al tercer elemento
copie desde el tercer al final en la posicion 4 de la matriz y en la posicion numero 3 ponga los nuevos datos. pero sin tener que recorrer un bucle, sino mas bien utilzando CopyMemory para hacelerar la funcion.

se que podria poner dos bucles y ordenarlo de la forma tradicional pero esto se haria muy lento si ablamos de 10000 elementos

pongo un ejemplo de lo que intento hacer, pero bien no estoy haciendo buen uso de CopyMemory


Código:
Option Explicit
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)

Private Type Datos
    Nombre As String
    Apellido As String
End Type

Dim dPersona() As Datos
Dim lCount As Long

Private Sub Command1_Click()
    AddList "bbb", "bbb"
    ImprimirListado
End Sub

Private Sub Form_Load()
    Me.Show
    ReDim dPersona(0)
   
    AddList "aaa", "aaa"
    AddList "bbb", "bbb"
    AddList "ccc", "ccc"
    AddList "ddd", "ddd"
    AddList "fff", "fff"
   
    ImprimirListado
End Sub

Private Sub ImprimirListado()
    Dim i As Long
    Cls
    For i = 0 To lCount
        Print dPersona(i).Nombre, dPersona(i).Apellido
    Next
End Sub

Private Sub AddList(Nombre As String, Apellido As String)
Dim i As Integer
Dim Ubicado As Boolean

lCount = UBound(dPersona)

If lCount = 0 Then
    dPersona(lCount).Nombre = Nombre
    dPersona(lCount).Apellido = Apellido
Else
    For i = 0 To lCount
        If Nombre < dPersona(i).Nombre Then
            'deberia copiar toda la matriz desde dPersona(i) a al siguiente dPersona(i + 1) todo el resto
            'de la extructura, pero no funciona :(
            CopyMemory ByVal dPersona(i + 1), ByVal dPersona(i), 8 * (lCount - i)
            'luego depositaria los nuevos datos en dPersona(i)
            dPersona(i).Nombre = Nombre
            dPersona(i).Apellido = Apellido
           
            Ubicado = True
            Exit For
        End If
    Next
   
    If Ubicado = False Then
        dPersona(lCount).Nombre = Nombre
        dPersona(lCount).Apellido = Apellido
    End If
End If

ReDim Preserve dPersona(lCount + 1)
End Sub


si alguien sabe como solucionar esto o conoce alguna otra forma se los agradezco
Saludos


« Última modificación: 15 Noviembre 2008, 18:00 pm por LeandroA » En línea

~~
Ex-Staff
*
Desconectado Desconectado

Mensajes: 2.981


Ver Perfil WWW
Re: Orderar Matriz utilizando CopyMemory en un solo bucle?
« Respuesta #1 en: 15 Noviembre 2008, 18:55 pm »

Citar
copie desde el tercer al final en la posicion 4 de la matriz y en la posicion numero 3 ponga los nuevos datos. pero sin tener que recorrer un bucle, sino mas bien utilzando CopyMemory para acelerar la funcion.

Una cosa, estás seguro de que internamente CopyMemory no es más que un bucle que va copiando bytes desde una posición hasta otra?? por que yo apostaría por que si, a lo mejor es más rápido que hacerlo en VB por la calidad del código pero vamos...

El algoritmo para ordenar datos más rápido que yo conozco es quicksort:
http://es.wikipedia.org/wiki/Quicksort

Prueba con él a ver si te da buenos resultados
Salu2


En línea

LeandroA
Moderador
***
Desconectado Desconectado

Mensajes: 760


www.leandroascierto.com


Ver Perfil WWW
Re: Orderar Matriz utilizando CopyMemory en un solo bucle?
« Respuesta #2 en: 15 Noviembre 2008, 20:48 pm »

Hola con lo de forma tradional me referia  a Quicksort, pero me es muy lento a lo que pienso, porque si yo ingreso 10000 itens y cada ves que ingreso uno tengo que ordenarlo y despues imprimiro esto es una operacion tremenda ya que en el utlimo items estaria haciendo un bucle de 10000 * 10000 (creo)

a lo que yo apunto que no estoy seguro si es posible de esta forma, es mover todo el bloque entero de un saque, y no desplazando items por items.

Saludos
En línea

‭‭‭‭jackl007


Desconectado Desconectado

Mensajes: 1.403


[UserRPL]


Ver Perfil WWW
Re: Orderar Matriz utilizando CopyMemory en un solo bucle?
« Respuesta #3 en: 15 Noviembre 2008, 21:10 pm »

que yo sepa el que dice leandro es el burbuja (Segun lo que posteaste)...
el Quicksort, es uno de los mas veloces (simples)
En línea

cobein


Desconectado Desconectado

Mensajes: 759



Ver Perfil WWW
Re: Orderar Matriz utilizando CopyMemory en un solo bucle?
« Respuesta #4 en: 15 Noviembre 2008, 22:53 pm »

El problema del copymemory lo podes solucionar utilizando una coleccion en paralelo al array y guardando el indice del valor. De esa manera la que queda ordenada es la coleccion y esta apunta al indice en el array.
En línea

http://www.advancevb.com.ar
Más Argentino que el morcipan
Aguante el Uvita tinto, Tigre, Ford y seba123neo
Karcrack es un capo.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Ayuda] Sobre copyMemory
Programación Visual Basic
ignorantev1.1 0 1,820 Último mensaje 24 Febrero 2011, 22:37 pm
por ignorantev1.1
Invoke WININET y CopyMemory
Programación Visual Basic
STARZ 6 3,062 Último mensaje 30 Enero 2012, 08:56 am
por BlackZeroX
Matriz , bucle a medias (buscaminas)
Programación C/C++
Neibar 1 2,380 Último mensaje 12 Junio 2012, 11:19 am
por Neibar
La 'app' rusa que te puede encontrar en la Red utilizando solo una foto
Noticias
wolfbcn 0 1,539 Último mensaje 20 Mayo 2016, 02:54 am
por wolfbcn
Ayuda C++ bucle imprime solo una parte de la tabla
Programación C/C++
Raiden 3 2,838 Último mensaje 17 Agosto 2020, 20:04 pm
por K-YreX
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines