javierri / Metodo-Ordenamiento-de-Arreglos

Método de Ordenamientos de Arreglos en Python
GNU General Public License v3.0
21 stars 10 forks source link

Error en el código del metodo de Selección #5

Open javierri opened 8 years ago

javierri commented 8 years ago

Al correr las siguentes funciones ...

# Algoritmo realizado en el GitHub
def OrdSeleccion1(arreglo):
    for i in range(len(arreglo)-1): # Usando Range
        menor = min(arreglo[i+1:])

        if (menor < arreglo[i]):
            arreglo.remove(menor)
            arreglo.insert(i,menor)

# Algoritmo realizado en Clase
def OrdSeleccion2(arreglo):
    i = 0
    for elem in arreglo[0:len(arreglo)-1]: # Usando sublistas
        menor = min(arreglo[i+1:])

        if (menor < elem):
            arreglo.remove(menor)
            arreglo.insert(i,menor)
        i = i + 1

Encontramos que OrdSeleccion1 funciona y OrdSeleccion2 NO funciona.. ver ejecución del código en https://repl.it/BuRa

Deben revisar los código y detectar por que no funciona, el primero que coloque una respuesta correcta en este foro tendrá 3 puntos adicionales en el examen

OJO.. evidentemente hay un cambio en el for.. por favor no me den como respuesta que el for de cambio de tal a tal.. esa no es la respuesta.. o que en uno uso un range y en el otro la sublista... tampoco es la respueta y el error tampoco esta en el if.. esta en el for.

La respuesta que quiero, es que pasa o que esta pasando cuando se realiza ese cambio..

PD: No pueden participar los estudiantes que tienen total aprobado en el 1er parcial.

javierri commented 8 years ago

Por favor.. agradezco no dar respuesta a la ligera, por favor hacer pruebas, investigar y cuando tenga certeza de su respuesta indiquela.. GRACIAS !!!

cruz254 commented 8 years ago

prof el error q yo vi fue q el for no agarra las posiciones actualizadas del arreglo!

esto se debe a que estamos trabajando con sublista y esto ocasiona que los valores que va a tomar la variable elem no se van a alterar ! por lo tanto dicha sublista nunca cambiara su orden ! como ejemplo coloco el código arreglado ! https://repl.it/BuRa/116

ricardo cruz

yasmeliguerrero commented 8 years ago

El error esta en que el ordenamiento 2 no se esta moviendo con las posiciones a diferencia del ordenamiento 1, por lo cual lo que esta pasando cuando se realiza el cambio en el for es que no me cambia los valores debido a que lo toma como un parametro por valor y por ende no va a ordenar en la sublista

yasmeliguerrero commented 8 years ago

https://repl.it/BuRa/94

javierri commented 8 years ago

Saludos Ricardo..

Me estas diciendo que "los valores que va toma la variable elem no se van a alterar", esto es falso, la variable elem tiene un valor distinto en cada iteración. Efectivamente los elementos de la sublista nunca cambian, pero no dices con precisión por que ? Tienes _1 punto _

PD: No he podido ver los códigos que me adjuntan en repl.it... no abren esta muy lenta.

javierri commented 8 years ago

Saludos Yasmeli,

No entiendo que quieres decir con "el ordenamiento 2 no se esta moviendo con las posiciones a diferencia del ordenamiento 1", ambos ordenamientos se mueven.. yo diría en sus posiciones, pero se mueve.. ahora cuando dices "cuando se realiza el cambio en el for", no se a que for te refieres, supongo que al de la sublista. Ahora has acertado al mencionar lo de "como un parámetro por valor", aunque lo correcto es "como una variable por valor", que efectivamente afecta el ordenamiento.. pero aun faltan precisiones en el que pasa o esta pasando.. Tienes * 1 punto *

PD: La pregunta sigue abierta para mejorar la respuesta ..

javierri commented 8 years ago

Claro que si Yasmeli.. puedes volver a intentar ..

javierri commented 8 years ago

Hola Gepsy.. voy a tomar tu comentario y lo voy a revisar por partes ..

".. es un parámetro o variable por valor", ¿Quien? ".. por lo tanto no reconoce que debe hacer "

".. lo que esta haciendo es que divide lógicamente al arreglo en 2 ", _¿Quien? _

".. toma los primeros valores menores de ambos sub-arreglos que serian 1 y 2 luego solamente agarra el primer valor del sub-arreglo 1 por asi decirlo que seria el 5, luego su ultimo valor q seria el 4 y luego los últimos valores q se encuentran ordenados en ese sub-arreglo 3,9 y por ultimo los valores q tenia el sub-arreglo 2 que seria 6,7 y 8 que ya se encontraban ordenados."

No hay dos subarreglos ... solo hay un subarreglo.. La respuesta no es correcta.. además de confusa.. Gracias por el intento Gepsy...

mariacolmenares commented 8 years ago

buenos dias profesor el error se encuentra en la forma que se declara el menor ya que es declarada de la siguiente forma menor = min(arreglo[i+1:]) , esto lo que me indica esq que se va a evaluar una posicion mas aya de donde se encuentra la posicion i por lo cual esa posicion no va ser evaluada si es el menor o no la forma correta seria menor=min( arreglo[ i:] ) de esta forma si se va a ir evaluando todas las posiciones desde donde se encuentra i hasta el final como lo indica los dos puntos es importante tambien que para hacerlo de esta manera debo hace un cambio en el for quedando de esta manera for elem in arreglo: , realizando estos cambios al evaluar el if los elementos si van a realizar los cambios los numeros correctos y en las posiciones que le corresponden quedado asi ordenados .

por ultimo profe cuando dice que no pueden participar los estudiantes aprobado me imagino que se refieren a las personas que aprobaron el 1 er parcial sin necesitar los recuperativos ?.


Hola Franchesca... Tu respuesta es incrorecta, lo que dice no es cierto el calculo del menor es correcto, de hecho date cuenta que funciona en el primer ordenamiento.. esta completamente igual.

Cuando me referí a quienes no pueden participar, estabas tu.. por que me referí a nota final.. Gracias de todos modos por el intento.

orlandoortega commented 8 years ago

el error que yo veo en el codigo es que el for del segundo ordenamiento tiene un parametro por valor ya que le estas dando la referencia al for que repita solo en el arreglo original y entonces solo se va a cumplir la condicion del if tres veces para ese for..............


Saludos Orlando,

En tu comentario mencionas lo referente a parámetro por valor, ya indique que es correcto y corregí que es variable por valor, adicionalmente mencionas que solo se cumple la condición del if tres veces.. pero de ser cierto.. no me dices por que ?

GladysBG commented 8 years ago

Buenas tardes profe. El error que puedo observar es que el arreglo dentro del ese for esta sujeto a un parámetro por valor y según lo que leí en python los parámetros siempre se hacen por referencia,si dentro de la función se intenta hacer una modificación (mediante una asignación) a un parámetro formal, lo que hace Python es crear una copia de dicha variable y hace el cambio sobre ésta, por lo que el cambio no se realiza realmente en el parámetro real. por lo tanto la función lo que hace es que divide el arreglo en dos sublistas y no realiza ningún cambio.


Saludos Gladys,

Hay varios errores en respuesta.. ya comente que python maneja los dos tipos de parametros, por favor revisa las respuesta a los mensajes previos, por otro lado el error no esta en ningún parámetro, igualmente por favor lee las respuestas a los mensajes anteriores y por último tampoco no hay dos sublistas .. solo hay una. Intentalo de nuevo..

alan0802 commented 8 years ago

profesor, el error del segundo ejercicio radica en el valor por parametros, cuando se trabaja con valor por parametros se crea como una especie de copia en donde se comienza a trabajar el for, a pesar de que el programa corra me realiza las modificaciones en el arreglo original, y no en la copia si tenemos un arreglo a(original)=[5.3.4.2.1], el valor por parametros creara una copiaa=(copia)[5,3,4,2,1] y el for correra en esa copia, cuando realize las modificaciones las realizara en a original pero el for seguira corriendo en a copia, en cambio en el primero como es valor por referencia se trabaja en el arreglo original, y se realiza las modificaciones en el original,


Saludos Alan,

No se que es valor por parámetros.. lo que conozco parámetros por valor y variables por valor, o parámetros por referencia y varables por referencia.. ya comente en otras intervenciones que el error esta en la variable por valor (y repito no en ningún parámetro).. en atención al resto de tu respuesta hay aciertos pero no la puedo validar por que no se que es valor por parámetro.

orlandoortega commented 8 years ago

Prof. Complementando mi respuesta el for va solo a recoger la lista una vez y cuando consigue evaluar el primer numero con el menor y la condicion es validada los intercambia luego de esto avanza una poción pero no de la lista modificada sino de la lista original por eso en el proceso de repeticiones la variable elem va a tomar todos los números en el parametro del for incluyendo el numero uno y esto es ilógico dado que dicho numero en mi lista final ya va aparecer en orden y los últimos números los deja igual ya que cuando la variable elem toma el valor 9 los demás elementos o elementos siguientes de la lista ya están ordenados.


Saludos Orlando,

Muy bien, tu respuesta es una de las más acertadas, aunque tiene algunos pequeño errores conceptuales y fallas en la redacción.. insisto en que no confundan lo que es un parámetro con una variable.. son dos cosas distintas, hay que leer los mensajes y respuestas previas antes de responder para no cometer los mismos errores. Ahora efectivamente como ya han mencionado la lista recorrida es una sublista, que en este caso no seria la misma que la original, ya que hizo una copia en el for por concepto de variable por valor.. por eso el repita (el for), recorre una lista distinta a la que esta modificando y al hacer inserciones en esta, se cambian algunos de sus elementos de posición y estos no son reflejados en la sublista por ser otra prociendo así el error. Tienes 1 punto por tu aporte

R0entgen commented 8 years ago

el error esta en el len que esta en el for de la segunda funcion porque los elementos no tienen un indicador de parada y al momento de contabilizar las posiciones esta realizando bien el recorrido y no esta tomando en cuenta los elementos que posee el arreglo y el orden que deben de obtener luego de las iteraciones


Saludos Erik,

No hay error en el len... este es el correcto ya que debe recorrerse hasta el penultimo elemento del arreglo para poder tener una sublista donde buscar el menor.

VanessaDelCarmen commented 8 years ago

buenas noches profesor yo vi el error el segundo for en la parte de for elem in arreglo[0:len((arreglo)-1]: si tomamos la parte que esta en los corchetes y lo colocamos en un if donde seria if (i==len(arreglo)-1): hay nos saldria el arreglo ordenado lo cual se mueve de posicion pero esta vez para quedar de forma ordenada. Asi estaria recorriendo y ordenando al mismo tiempo el ordenamiento 2.... aqui anexo el codigo para que me entiendan un poco mejor https://repl.it/BuRa/168


Saludos Vanessa,

Aunque corriges el ejercicio, porque eliminas la sublista del for y adicionalmente validas que no se intente buscar una sublista después el último elemento, no me dice cual es el error que ocurre al colocar la sublista, solo me estas dado cual podría ser una posible solución.. tal como lo es el ordenamiento 1.

javierri commented 8 years ago

Saludos todos,

Primero que nada quiero felicitarles por sus valiosas intervenciones, creo que van a permitir aclarar muchas dudas que pueden tener.. estoy muy satisfecho con todas las respuestas. Voy a continuación a explicar el error..

ERROR EN EL PROGRAMA

Al crearse sublistas (o sub-arreglos) en un programa estos crean otras localidades de memoria para almacenar estos datos, por lo que podemos hablar de una variable por valor (se copia el valor a otra variable). En el caso del programa en el ordenamiento 2, el for recorre una sublista y dentro de las sentencias que repite el for hace cambios en una lista o arreglo (la original) que no es la que esta recorriendo.. al hacer estos cambios, que son inserciones, cambiamos la posición de alguno de los elementos de la lista original y al pasar a la siguiente iteración ya el elemento que esta en pos i en la lista original no es el mismo que esta en la pos i de la sublista (del for), y es hay de produce el error.

OJO:: El error de este ejercicio no se corrige cambiando el for.. hay otra forma de hacerlo.. los invito a buscar la solución sin cambiar el for.