Programación General > Pascal
Re: Ordenacion Por Selección
Alpha_:
Primero, disculpen si me equivoco, pero ese método es el de burbujeo. El de selección hasta donde yo sabía consistía en recorer la lista N veces y en cada iteración seleccionar el mayor/menor de la lista y ubicarlo donde corresponda.
Segundo. La lista no se te ordenará nunca porque estás cambiando los lugares en memoria donde están los nodos de la lista, pero tenés que actualizar también los enlaces. Lógicamente dentro de la lista, no hubo un solo cambio.
Cambiar debería ser
--- Código: Text ---procedure Cambiar (var Lista : TipoListaEnlazada; var Mayor, Menor : PunteroLista);var Aux : PunteroLista;begin Aux := mayor^.sig; Mayor^.sig := Menor^.sig; Menor^.sig := Aux;end;
Ni hace falta cambiar los datos en memoria. Sólo los enlaces.
Saludos Zorrinescos. xD
thot_ohm:
Gracias Enko, gracias Alpha. Por lo que deduzco ambos tienen razón.
Todo emocionado voy a compilar y va y me sale "Error while linking" y se situa en la última línea de código, al lado del último end. Que es eso? :(
thot_ohm:
Se me olvidaba Alpha. Burbuja, creo, es el que compara los datos de una lista de a dos de forma consecutiva y si el primero es mayor que el segundo se intercambian. Es decir:
5->4->8->2
Suponiendo que es un array (olvidémonos de los punteros un rato :blink: ), primero compara 5 y 4, como 5 es más mayor, los intercambia:
4->5->8->2
Ahora compara 5 y 8, quedaría igual. Luego Compara 8 y 2 y como se cumple la condición:
4->5->2->8
Y así iterativamente hasta que lo ordena. Suponiendo que el array (A)sea de 4 elementos el código sería algo así:
--- Código: Text --- for j:=1 to 3 do for i:=1 to 3 do if (A[i] > A[i+1]) then Cambiar(A[i],A[i+1])
Selección compara un elemento con el resto de los elementos del array. Es decir:
5->4->8->2
Compara 5 con 4, los cambia:
4->5->8->2
Ahora compara 4 con 8 (el tercer elemento) y queda igual. Por último compara el 4 con el 2, y por supuesto, los intercambia:
2->5->8->4
El código es algo así:
--- Código: Text --- for Recorrido:= 1 to N-1 do for J :=Recorrido+1 to N do If (A[Recorrido]>A[J]) then Cambiar(A[Recorrido],A[J])
Es decir la idea de éste último método de ordenación es ubicarse en la primera posición del array, seleccionar el elemento de menor tamaño y ponerlo en la primera posición, luego se ubica en la segunda posición y busca el siguiente elemento más pequeño y lo pone en ésta segunda posición etc...
Vamos, según tengo yo entendido. Como yo estoy aprendiendo, es muy probable que éste equivocado en algún punto. La idea no es dármela de listillo, si no de aprender. Si estoy errado, por favor díganme donde. Gracias.
thot_ohm:
Probé en otra computadora y no me daba el "error while linking". Ahora puedo ejecutar el programa, pero en plena ejecucion me da un error. Exitcode =216. Que es esto??
thot_ohm:
Rescatando un poco este post y para dejar la solución al problema que planteaba para futuras consultas.
Lo del "error while linking" y el "exitcode=216" al parecer lo provocaba el compilador (FreePascal), probé con TurboPascal y corre sin problemas.
El procedimiento cambiar quedó definitivamente de la siguiente manera:
--- Código: Text --- procedure Cambiar (var Lista : TipoListaEnlazada; var Mayor, Menor : PunteroLista); var Aux : PunteroLista;begin new(Aux); Aux^.Datos := Mayor^.Datos; Mayor^.Datos := Menor^.Datos; Menor^.Datos := Aux^.Datos;end;
Lo que hice fué simplemente cambiar los datos contenidos en los punteros sin cambiar sus enlaces. No se si será medio chapucera esta forma, pero así funciona.
Agradecería cualquier sugerencia, pero como digo, funciona.
Navegación
[#] Página Siguiente
[*] Página Anterior
Ir a la versión completa