Programación General > C/C++

 Ordenar números de menor a mayor

(1/2) > >>

player_:
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 --- #include <stdio.h>#include <stdlib.h>#define SIZE 10  int main( void ) {        int a[ SIZE ] = { 2, 6, 4, 8, 10, 12, 89, 68, 45, 37 };    int pass;    int i;      int hold;       printf( "Data items in original ordern" );         for ( i = 0; i < SIZE; i++ ) {      printf( "%4d", a[ i ] );   }      for ( pass = 1; pass < SIZE; pass++ ) {             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;         }        }      }/    printf( "nData items in ascending ordern" );       for ( i = 0; i < SIZE; i++ ) {      printf( "%4d", a[ i ] );   }     printf( "n" );system("PAUSE");   return 0;  }   
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:
No declares "stdlib.h" si no la vas a usar.

Mejor ordena el array así:

--- Código: C --- int aux = 0;for(signed int i = 0; i < SIZE; i++)    {        for(signed int j = 0; j < SIZE; j++)        {            if(a[i] < a[j])            {                aux = a[i];                a[i] = a[j];                a[j] = aux;            }        }    } 
Creo que es más legible y entendible.

player_:
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:
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_:
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?

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa