Ordenar sin olvidar el orden inicial
De Ejercicios
Contenido |
Enunciado
Modifica el programa ordena.c de manera que, además de mostrar el vector ordenado, muestre también el vector original. Además deberá mostrar la posición que cada número ocupaba en el vector inicial. Guarda este programa con nombre reordena.c.
Una salida posible podría ser:
El vector inicial es: {7, 23, 5, 1, 8, 3, 12}
El vector ordenado es: {1, 3, 5, 7, 8, 12, 23}
que ocupaban los lugares {4, 6, 3, 1, 5, 7, 2}, respectivamente.
Soluciones
Programa en C por Angel
Solución comentada del Ejercicio:
/* fichero reordena.c */ #include <stdio.h> #define SIZE 7 void main(void) { int vector[SIZE], copia[SIZE], orden[SIZE]; int j, i, temp; printf("Introduzca los %d valores para ordenar:\n", SIZE); for(i=0; i<SIZE; i++) { printf("\n%d: ", i+1); scanf("%d", &vector[i]); copia[i]=vector[i]; orden[i]=i+1; } for (i=0; i<(SIZE-1); i++) for (j=i+1; j<SIZE; j++) if (vector[j]<vector[i]) { temp=vector[j]; vector[j]=vector[i]; vector[i]=temp; temp=orden[j]; orden[j]=orden[i]; orden[i]=temp; } printf("\nEl vector inicial es: { "); for (i=0; i<SIZE; i++) printf("%d, ", copia[i]); printf("\b\b} \n"); /* se utiliza backspace */ printf("El vector ordenado es: { "); for (i=0; i<SIZE; i++) printf("%d, ", vector[i]); printf("\b\b} \n"); printf("que ocupaban los lugares { "); for (i=0; i<SIZE; i++) printf("%d, ", orden[i]); printf("\b\b}, respectivamente.\n"); }
Comentario
El funcionamiento del programa de ordenación de los elementos de un vector se vió en la práctica anterior. Para evitar perder el vector original con el cambio, lo que se hace es una simple copia del mismo con la instrucción copia[i] = vector[i].
Para saber en qué posición estaban los elementos en el vector original, se crea un nuevo vector llamado orden[ ], cuyos elementos son los números naturales 1, 2, 3, 4. ... Este vector sufre las mismas permutaciones que el vector inicial, por lo que, al final de la ordenación sus elementos indicarán que posición ocupaban al principio los elementos del vector ordenado. Para obtener exactamente la salida impresa solicitada, hay que imprimir las llaves { } y los blancos y comas que separan los elementos de los vectores. Después de escribir cada elemento de un vector se escribe una coma y un blanco. En realidad esto no hay que hacerlo para el último elemento, que debe ir seguido por el cierre de las llaves. Sin embargo, por simplicidad se escriben también en este caso la coma y el blanco, pero luego se imprimen dos caracteres backspace ('\b', espacio hacia atrás), con lo cual el cierre de las llaves se imprime sobre la coma.
Diseño en Pseudocódigo
ALGORITMO Reordena CONSTANTES: SIZE=7 ENTRADAS: vector: ARRAY (0...SIZE-1) DE ENTEROS (vector que queremos ordenar) SALIDAS: copia: ARRAY(0...SIZE-1) DE ENTEROS (vector copia con los valores originales) orden: ARRAY(0...SIZE-1) DE ENTEROS (posición original de los valores ordenados) VARIABLES: temp: ENTERO i: ENTERO j: ENTERO INICIO (Leer los valores del array) ESCRIBIR "Introduzca los", SIZE, "valores para ordenar:") PARA i<--0 HASTA SIZE-1 HACER ESCRIBIR i+1, ": " LEER vector(i) copia(i)<--vector(i) orden(i)<--i+1 FIN_PARA (Reordenar el vector) PARA i<--0 HASTA SIZE-2 HACER PARA j<--i+1 HASTA SIZE-1 HACER SI vector(j)<vector(i) ENTONCES (Cambiar los valores del vector) temp<--vector(j) vector(j)<--vector(i) vector(i)<--temp (Cambiar las posiciones originales) temp<--orden(j) orden(j)<--orden(i) orden(i)<--temp FIN_SI FIN_PARA FIN_PARA (Mostrar el array original) ESCRIBIR "El vector inicial es: {" PARA i<--0 HASTA SIZE-1 HACER ESCRIBIR copia(i), ", " FIN_PARA ESCRIBIR "}" (Mostrar el array ordenado) ESCRIBIR "El vector ordenado es: {" PARA i<--0 HASTA SIZE-1 HACER ESCRIBIR vector(i), ", " FIN_PARA ESCRIBIR "}" (Mostrar las posiciones originales) ESCRIBIR "que ocupaban los lugares {" PARA i<--0 HASTA SIZE-1 HACER ESCRIBIR orden(i), ", " FIN_PARA FIN