• Lunes 29 de Abril de 2024, 03:34

Autor Tema:  Ordenar números de menor a mayor  (Leído 24331 veces)

player_

  • Miembro activo
  • **
  • Mensajes: 51
    • Ver Perfil
Ordenar números de menor a mayor
« en: Domingo 12 de Julio de 2009, 00:22 »
0
Hola a todos. Estoy revisando este código que imprime un array y luego ordena sus números de menor a mayor, pero tengo una duda con este proceso. El código es el siguiente:

Código: Text
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #define SIZE 10
  5.  
  6.  
  7. int main( void )
  8. {  
  9.  
  10.    int a[ SIZE ] = { 2, 6, 4, 8, 10, 12, 89, 68, 45, 37 };
  11.    int pass;
  12.    int i;  
  13.    int hold;
  14.    
  15.    printf( "Data items in original ordern" );
  16.    
  17.    
  18.    for ( i = 0; i < SIZE; i++ ) {
  19.       printf( "%4d", a[ i ] );
  20.    }
  21.  
  22.    
  23.   for ( pass = 1; pass < SIZE; pass++ ) {
  24.  
  25.      
  26.      for ( i = 0; i < SIZE - 1; i++ ) {      
  27.  
  28.          
  29.          if ( a[ i ] > a[ i + 1 ] ) {  
  30.             hold = a[ i ];                  
  31.             a[ i ] = a[ i + 1 ];
  32.             a[ i + 1 ] = hold;
  33.          }
  34.  
  35.       }
  36.  
  37.     }/
  38.  
  39.    printf( "nData items in ascending ordern" );
  40.  
  41.    
  42.    for ( i = 0; i < SIZE; i++ ) {
  43.       printf( "%4d", a[ i ] );
  44.    }
  45.  
  46.    printf( "n" );
  47. system("PAUSE");
  48.    return 0;
  49.  
  50. }
  51.  
  52.  

La parte que está en negrita es la que me da dudas. Voy a depurarla hasta donde me pierdo:

 for ( pass = 1; pass < SIZE; pass++ ) {  EMPEZAMOS CON LA PRIMERA PASADA

  for ( i = 0; i < SIZE - 1; i++ ) {      

         
         if ( a[ i ] > a[ i + 1 ] ) {  
            hold = a[ i ];                  
            a[ i ] = a[ i + 1 ];
            a[ i + 1 ] = hold;


primer ciclo del segundo for     i=0; i<9; 0++
si a[0] es mayor que a[1] EN ESTE CASO NO, valor de a[0] almacenado, SEGUIMOS CON EL FOR


segundo ciclo del segundo for i=1; i<9, 1++
si a[1] mayor que a[2] EN ESTE CASO CIERTO, 6 es mayor que 4, SEGUIMOS
hold= a[1]
a[1]=a[2]
a[2]=hold        ahora hold tiene asignado el valor de a[2]

entonces, como quedaría el array en este momento?

{ 2, 4, ¿6?,} ó {2, 4} La verdad que no entiendo muy bien cómo la variable hold va almacenando los nuevos valores y sustituyéndolos o intercambiándolos en el array, a ver si alguien me lo puede explicar. Gracias!!

Leo_Gutierrez

  • Visitante
Re: Ordenar números de menor a mayor
« Respuesta #1 en: Domingo 12 de Julio de 2009, 20:04 »
0
No declares "stdlib.h" si no la vas a usar.

Mejor ordena el array así:
Código: C
  1.  
  2. int aux = 0;
  3. for(signed int i = 0; i < SIZE; i++)
  4.     {
  5.         for(signed int j = 0; j < SIZE; j++)
  6.         {
  7.             if(a[i] < a[j])
  8.             {
  9.                 aux = a[i];
  10.                 a[i] = a[j];
  11.                 a[j] = aux;
  12.             }
  13.         }
  14.     }
  15.  

Creo que es más legible y entendible.

player_

  • Miembro activo
  • **
  • Mensajes: 51
    • Ver Perfil
Re: Ordenar números de menor a mayor
« Respuesta #2 en: Domingo 12 de Julio de 2009, 20:42 »
0
stdlib.h lo declaro para usarlo con el system("PAUSE");

Pero con el ejemplo que has puesto, a está valiendo 0 en las 10 primeras pasadas y sólo a[j] cambia de valor, entonces estás comparando a[0] con a[1], a[0], a[2], a[0] con a[3].... de la otra forma se compara a[0] con a[1], a[1] con a[2], a[2] con a[3] y se va cambiando de argumento todo el rato para comparar si el valor de antes es mayor  al de después, y entonces lo cambia de posición para ordenarlo de menor a mayor. Lo que no entiendo es cómo los cambia de posición, el cómo va almacenando esos números en la variable aux ó en la variable hold de mi ejemplo, una aclaración mediante depuración de como va almacenando esos números es lo que necesito para verlo claro.

Supongo que no cambiará los valores de posición tal cual y los irá poniendo uno tras otro eliminando por ejemplo el que sobra como aquí:
{ 2, 6, 4}

pasará a ser {2, 4} y el 6 desaparece, entonces cuando acaban esas 10 pasadas se vuelve al for ( pass = 1; pass < SIZE; pass++ ) { y pass se incrementa a 2, en las siguientes 10 pasadas del segundo for comparará de nuevo el 6 y lo añadirá a la lista de números ordenados? Eso es lo que no veo bien y me hace no entender el problema.

Gracias..

EI: juntando mensajes, usa el boton Editar por favor.

Es correcta mi explicación? Aún no he conseguido ver este código y hasta que no lo vea claro no puedo seguir avanzando. Gracias.

locazopro

  • Miembro activo
  • **
  • Mensajes: 51
    • Ver Perfil
Re: Ordenar números de menor a mayor
« Respuesta #3 en: Martes 14 de Julio de 2009, 05:53 »
0
creo que te estas confundiendo demasiado, ese método de ordenamiento se llama bubble sort, busca mas info en la red, pero básicamente te digo que se trata de ir haciendo que los elementos "pesados" se vallan al fondo del array, respecto al intercambio no comprendo exactamente que es lo que no entiendes, se trata solo de intercambiar los valores en a y a[j], obvio se necesita una variable auxiliar para hacerlo, pero no se exactamente cual es tu duda

pd: bubble sort es de lo peor que puedes ocupar para ordenar algo.

player_

  • Miembro activo
  • **
  • Mensajes: 51
    • Ver Perfil
Re: Ordenar números de menor a mayor
« Respuesta #4 en: Martes 14 de Julio de 2009, 10:17 »
0
Mi duda viene por la utilización de la variable auxiliar, que no consigo ver cuál es realmente su función a la hora de depurar el código.


Tenemos { 2, 6, 4, 8, 10, 12, 89, 68, 45, 37 }

 for ( i = 0; i < SIZE - 1; i++ ) {      
 
         
         if ( a[ i ] > a[ i + 1 ] ) {  
            hold = a[ i ];                  
            a[ i ] = a[ i + 1 ];
            a[ i + 1 ] = hold;


si a[0] no entra en el if

Resultado --> Tenemos { 2, 6, 4, 8, 10, 12, 89, 68, 45, 37 }

si a[1] sí que entra en el if, entonces tenemos

hold = a[1]     { 2, HOLD(6), 4, 8, 10, 12, 89, 68, 45, 37 }
a[1] = a[2]
a[2] = hold

Variable hold --> { 2, 4, HOLD(6), 8, 10, 12, 89, 68, 45, 37 }

Resultado --> Tenemos { 2, 4, 6, 8, 10, 12, 89, 68, 45, 37 }

si a[2] no entra en el if? Porque se supone 6<8

si a[3] no entra en el if? Porque 8<10

si a[4] no entra en el if? Porque 10<12

SI a[5] no entra en el if? Porque 12<89

si a[6] sí que entra en el if, entonces tenemos

hold = a[6]      { 2, 4, 6, 8, 10, 12, HOLD(89), 68, 45, 37 }
a[6] = a[7]
a[7] = hold

Variable hold --> { 2, 4, 6, 8, 10, 12, 68, HOLD(89), 45, 37 }

Resultado --> Tenemos { 2, 4, 6, 8, 10, 12, 68, 89, 45, 37 }

De forma depurada y paso por paso, este sería el modo de funcionamiento de hold a la hora de cambiar de lugar?

Dsfase

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Ordenar números de menor a mayor
« Respuesta #5 en: Martes 14 de Julio de 2009, 10:39 »
0
Cita de: "player_"
Mi duda viene por la utilización de la variable auxiliar, que no consigo ver cuál es realmente su función a la hora de depurar el código.

Olvidate del array y ves a un caso más sencillo:

Tienes:

Código: C
  1.  
  2. int a = 2, b = 3;
  3.  
  4.  

Para poder intercambiar esos dos valores necesitas una variable auxiliar, tal que así:
Código: C
  1.  
  2. int aux;
  3. aux = a;
  4. a = b;
  5. b = a;
  6.  
  7.  

De no hacerlo así perderías siempre uno de los dos valores.

En el caso que estás analizando, lo que tienes que hacer es comparar el elemento i con el elemento i+1, si es mayor tienes que intercambiar los dos valores, por eso usas la variable auxiliar. No tiene otra función.

Un saludo

player_

  • Miembro activo
  • **
  • Mensajes: 51
    • Ver Perfil
Re: Ordenar números de menor a mayor
« Respuesta #6 en: Martes 14 de Julio de 2009, 10:50 »
0
Código: Text
  1.  
  2. int aux;
  3. aux = a;
  4. a = b;
  5. b = a;
  6.  
  7.  

Eso sería así? Creo que al final b tiene que ser igual a aux y no igual a "a"

Código: Text
  1.  
  2. int aux;
  3. aux = a;
  4. a = b;
  5. b = aux;
  6.  
  7.  

Y mi depuración del código con la variable hold, está bien? Así cambiaría de posición paso a paso la variable hold, no?

Dsfase

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Ordenar números de menor a mayor
« Respuesta #7 en: Martes 14 de Julio de 2009, 10:59 »
0
Cita de: "player_"
Código: Text
  1.  
  2. int aux;
  3. aux = a;
  4. a = b;
  5. b = a;
  6.  
  7.  

Eso sería así? Creo que al final b tiene que ser igual a aux y no igual a "a"

Código: Text
  1.  
  2. int aux;
  3. aux = a;
  4. a = b;
  5. b = aux;
  6.  
  7.  
Sí, perdona el descuido.

Citar
Y mi depuración del código con la variable hold, está bien? Así cambiaría de posición paso a paso la variable hold, no?
La depuración si la has hecho y te da eso, pues por supuesto que estará bien, no me he puesto a mirarlo paso a paso, jeje. Pero hold siempre tomara el valor de a siempre que se ejecute el if, no tiene mas misterio, no te comas mas el tarro :P

player_

  • Miembro activo
  • **
  • Mensajes: 51
    • Ver Perfil
Re: Ordenar números de menor a mayor
« Respuesta #8 en: Martes 14 de Julio de 2009, 11:04 »
0
Lo que intentaba emular con la depuración es la forma en la que la variable hold cambiaba las posiciones en la memoria, el resultado está bien, pero la interpretación de esos cambios es lo que no sé si es correcto. Gracias.