Ver Mensaje Individual
  #2 (permalink)  
Antiguo 17/05/2015, 11:38
Avatar de xKuZz
xKuZz
 
Fecha de Ingreso: febrero-2015
Ubicación: nullptr
Mensajes: 183
Antigüedad: 9 años, 8 meses
Puntos: 27
Información Respuesta: Ordenar un arreglo de objetos de manera descendete

Hay 2 errores en tu algoritmo de ordenamiento:

Primer error: Condición de los bucles for
Tal y como se puede deducir de tu código m es el número total de elementos de tu arreglo, lo que implica que los datos con los que tu quieres trabajar se almacenan desde ar[0] hasta ar[m-1].


Como ya sabrás al implementar el algoritmo de ordenamiento por selección vamos mirando de izquierda a derecha dato a dato y a su vez comprobamos que todos los de la derecha de este no sean (en este caso) mayores que el primero. Por tanto, tu parte más externa del bucle tiene que funcionar hasta llegar a m-2 y tu parte más interna del bucle hasta m-1. Aquí te dejo el fragmento que tú tenías escrito y la versión correcta del mismo.

Versión incorrecta
Código C++:
Ver original
  1. for (int h=0;h<=m-1;h++){               //ordenamiento
  2.            .........
  3.             for (int k=h+1; k<=m; k++){
  4.                ........
  5.                 }
  6.             }

Versión correcta
Código C++:
Ver original
  1. for (int h=0;h<=m-2;h++){               //ordenamiento
  2.            .........
  3.             for (int k=h+1; k<=m-1; k++){
  4.                ........
  5.                 }
  6.             }

Nota: Al trabajar de la forma incorrecta tu algoritmo de ordenación accedía a datos basura lo cual podía haber alterado los datos resultantes.

Segundo error: Intercambio de datos
A la hora de mover de sitio ambos datos sólo estás poniendo el menor con los datos del mayor pero no intercambiándolos.

Versión incorrecta
Código C++:
Ver original
  1. for (int h=0;h<=m-2;h++){               //ordenamiento
  2.            .........
  3.             for (int k=h+1; k<=m-1; k++){
  4.                ........
  5.                 }
  6. ar[posmayor] = ar[h];
  7.             }

Versión correcta
Código C++:
Ver original
  1. for (int h=0;h<=m-2;h++){               //ordenamiento
  2.            .........
  3.             for (int k=h+1; k<=m-1; k++){
  4.                ........
  5.             }
  6. atraccion intercambio
  7. intercambio=ar[posmayor];
  8. ar[posmayor] = ar[h];
  9. ar[h]=intercambio;
  10. }

Nota aclaratoria: El siguiente código no hace ninguna modificación. El operador de asignación = por defecto copia todos los datos miembros de una clase a la que quieres asignarlo

Código innecesario
Código C++:
Ver original
  1. ar[h].set_x(mayor);