¿Como ordenar 3 números? (¿Y sin usar la funcion sort?)

Me gustó este problema, porque parece fácil pero no es trivial escribir una solución elegante. Elegante en el sentido de que no sea un choclo de “ifs” dificil de debuggear (encontrar errores) ni que sea difícil entender que hace.

Tambien esta bueno para probar la función sort de C++.
Link al enunciado: http://juez.oia.unsam.edu.ar/#/task/tri_sort/statement

3 Me gusta

Banco fuerte la solución con 6 ifs, deja la lógica super expuesta y es bastante más ameno de leer+entender que un encadenado de ifs.

Exacto, 6 ifs es la que va

¿Qué tal una con 3 ifs?

Sean a,b,c los números de la entrada.

si a > b intercambiar a con b si b > c intercambiar b con c // en c ya tenemos el mayor de todos, asi que basta arreglar a con b si a > b intercambiar a con b

Intercambiar x con y puede ser la funcion swap, o el sencillo:

temporal = x;
x = y;
y = temporal;

2 Me gusta

Dicho eso, me parece mucho mejor 6 if que consulten en la guarda por la permutacion completa (cosas como if (a <= c && c <= b) ) antes que un choclo de anidamientos.

1 me gusta

Si, esta idea me gusta mucho. Lo divertido es que es Bubble Sort (ordenamiento burbuja) con 3 elementos https://es.wikipedia.org/wiki/Ordenamiento_de_burbuja

Igual la mas simple es la de 6 ifs porque es muy fácil ver que es correcta. Pero es mas propensa a bugs por olvidarse algo o hacer un caso mal.
Hay una tercer opción, que esconde un poco de logica en otras funciones de C++.
La idea es que de los 3, uno será el mínimo, otro será el máximo y un tercero (que no sabemos quien es) va a estar “ensanguchado”.

m = min(a, min(b, c))
M = max(a, max(b, c))

if (m <= a && a <= M) 
    imprimir m, a, M
else if (m <= b && b <= M) 
    imprimir m, b, M
else // (m <= c && c <= M)
    imprimir m, c, M

Edit: Esto no anda

¿Eso de los if del sánguche funciona? Me parece que si a es el mínimo por ejemplo, (a,b,c) = (1,2,3), eso mostraría 1,1,3.

La que se puede hacer es

mini = min(a, min(b,c))
maxi = max(a, max(b,c))
medio = a+b+c - mini - maxi
imprimir mini, medio, maxi

4 Me gusta

Tenes razon, mucho mejor la tuya

Hola mi nombre es Fabio… yo usé esta solución, usando el método de la burbuja…
y… utilizando un vector para solo utilizar bucles… Espero sea bienvenida :slight_smile:

void ordenar(int v[]){
	int aux;
	
	for(int i=0;i<3;i++){
		for(int j=i;j<3;j++){
			if(v[i]>v[j]){
				aux=v[i];
				v[i]=v[j];
				v[j]=aux;
			}
			
		}
		
	}


}

2 Me gusta

¡Hola Fabio! Está perfecto el método de burbujeo, si te fijás la idea de qué pares ir comparando es idéntica a la que propuse en la primera versión que postié. El detalle es que esta versión usa for, y al ser solo 3 números, sale razonablemente programarlo incluso conociendo solamente if.

1 me gusta