i02mike escribió:Así de primeras lo que veo un poco raro es que calcular mínimo esté dentro del for. ¿No se supone que eso solo se debería hacer una vez?
Está haciendo ordenación por selección, esa parte es correcta.
El problema no es de concepto sino de algún error tonto. Con el código actual se me hace díficil verlo pues hay algunas prácticas malas. Cosas que haría:
- Eliminar las referencias en las funciones que usan Tarray&, los arrays no requieren de referencias!
- Evitar muchas referencias innecesarias, es preferible devolver un parámetro. Suele quedar más claro y es más fácil analizar el comportamiento de la función.
- Tus funciones son muy específicas y muy enfocadas a tu caso particular cuando deberían ser más generales. Por ejemplo intercambiar podría ser intercambiar dos números a y b cualquiera, no hace falta que sean de un array. Este enfoque facilita reutilizar código y elimina dependencias innecesarias, es más fácil depurar 3 funciones independientes que 3 funciones que dependen entre sí.
- Nombres más descriptivos.
- En intercambiar estas asignando un unsigned a un int, cuidado.
- Eliminar el tipo Tarray, pues no aporta nada.
Este es mi código refactorizado:
/*
* ejercicio2.cpp
*
* Created on: 05/02/2016
* Alumno:
* Titulación:
* Grupo:
* PC usado:
*/
#include <iostream>
using namespace std;
const int MAX = 8;
/* ordena los elementos del array a de menor a mayor
* por el método de Selección
*/
int obtenerPosMinimo(const int input[],int index)
{
int minimo = index;
for(int i = index+1;i < MAX;i++)
{
if(input[i] < input[minimo])
{
minimo = i;
}
}
return minimo;
}
void intercambiar(int &a,int &b)
{
int aux = a;
a = b;
b = aux;
}
void ordenar(int input[])
{
for(int i=0; i<MAX; i++)
{
int min = obtenerPosMinimo(input,i);
intercambiar(input[i],input[min]);
}
}
int main()
{
int a[MAX] = { 2, 7, 12, 89, 5, 2, 9, 10 };
/* Mostramos el array antes de ordenarlo */
cout << "El array antes de ordenarlo: ";
for (int i = 0; i < MAX; i++)
{
cout << a[i] << " ";
}
cout << endl;
/* ordenamos el array */
ordenar(a);
/* Mostramos el array después de ordenarlo */
cout << "El array después de ordenarlo: ";
for (int i = 0; i < MAX; i++)
{
cout << a[i] << " ";
}
cout << endl;
return 0;
}
Por alguna razón, ahora funciona bien.