[ Foro de Pascal ]
Hola profesor Nacho, mira tengo el siguiente problema y quisiera pedir tu valiosa ayuda.
1 |
2 |
3 |
4 |
5 |
10 |
5 |
-7 |
0 |
12 |
1 |
2 |
3 |
4 |
5 |
3 |
4 |
2 |
1 |
5 |
No entiendo bien la pregunta, porque los dos vectores que muestras no son un vector original y el mismo vector ordenado, que sería algo como
vector dado 10 6 -7 0 12
vector resultante -7 0 6 10 12
Si lo que quieres realmente es ordenar, hay varios métodos de ordenación. Uno de los más sencillos es el "burbuja", pero también hay uno de "inserción directa" y un de "intercambio directo" que son fáciles de entender.
La idea general (con pequeños cambios en cada método concreto) sería algo como
para i = 1 hasta numeroDatos
para j = i+1 hasta numeroDatos
si dato[j]<dato[i] intercambiar (i,j)
de forma que en la primera pasada dejas colocado el dato más pequeño, en la segunda pasada dejas colocado el segundo, y así sucesivamente.
Entendido, Oscar.
En tu fuente hay una cosa prohibida, según los requisitos que te piden: cuando haces
temp:=a[i];
a[i]:=a[j];
a[j]:=temp;
estás modificando el vector original.
Aun así, eso de que tampoco te dejen hacer una copia de él, es una restricción bastante fuerte, porque la mayoría de métodos de ordenación sencillos se basan en poder recolocar los elementos, de modo que obtienes el menor elemento, lo colocas al principio y ya "te olvidas de él" y te centras en los demás, para que en cada "pasada" descartes uno.
Si ordenas sobre otro vector, puedes encontrar correctamente el primer elemento, pero como lo colocas en la primera posición, volvería a aparecerte como un dato más para la segunda pasada, no puedes "olvidarte de él" con tanta facilidad.
Una forma de conseguir saber cuales has colocado ya, sin poder copiar ni modificar el vector original, sería usar un segundo vector en el que apuntaras cuáles ya están colocados (un vector de "boolean": true para indicar si ya está ordenado, o false para indicar que todavía no lo está).
Yo lo que haría es algo basado en el método de ordenación de "inserción directa": buscas el menor en cada pasada, y al final de la pasada lo colocas en su sitio correcto. El método original es algo como
para i = 1 hasta numeroDatos
posicionMenor = i
para j = i+1 hasta numeroDatos
si dato[j]<dato[i] entonces posicionMenor = j
finpara
intercambiar (i,posicionMenor)
finpara
En tu caso, podría ser algo como
para i = 1 hasta numeroDatos
posicionMenor = i
para j = i hasta numeroDatos
si ordenado[j] = false entonces
si dato[j]<dato[i] entonces posicionMenor = j
finpara
nuevoVector[j] = i
ordenado[j] = true;
finpara
Es decir, en cada pasada vuelves a comparar desde el primer valor (no desde el "i", porque no has recolocado nada), y comparas sólo los que todavía no has ordenado.
Suerte con ello! ;-)
(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)