No entiendo esta lógica [arreglos] [C]

Iniciado por barnix456, 6 Diciembre 2012, 17:47 PM

0 Miembros y 1 Visitante están viendo este tema.

barnix456

Hola, estoy aprendieno C y estoy leyendo un libro, ya voy en el apartado de arreglos, y me tome con un ejemplo del ordenamiento de tipo burbuja utilizando arreglos, lo principal del programa es que inicializa un arreglo con datos cualquiera y los ordena de forma ascendente, pero no entiendo realmente el asunto  de las comparaciones que hace, se los dejo, espero alguien me explique saludos.


#include <stdio.h>
#include <stdlib.h>
#define sise 10
int main()
{
    int a[sise]={2,6,4,8,10,12,89,68,45,37};    //inicializamos el arreglo
    int i, pass, hold;

    printf("datos ordenados originalmente\n");

    for(i=0;i<=sise-1;i++) {printf("%4d",a[i]);}

    for(pass=1;pass<=sise-1;pass++) // se recorre el arreglo
        for (i=0;i<=sise-2;i++)   
            if(a[i]>a[i+1]){       //se comparan cual es mayor
                hold=a[i];        //hold toma el valor de a[i]
                a[i]=a[i+1];      //creo que se modifica el valor de a[1]
                a[i+1]=hold; }    //Se regresa el valor de a[i+1] a hold(valor original)
    printf("\n Dator ordenados en orden ascendente\n");

    for(i=0;i<=sise-1;i++)
        printf("%4d", a[i]);   
    printf("\n");

    return 0;
}


no entiendo como ocurre el ordenamiento, disculpen soy novato...
"No temo a los ordenadores; lo que temo es quedarme sin ellos"

Isaac Asimov

rir3760

Cita de: barnix456 en  6 Diciembre 2012, 17:47 PM
Hola, estoy aprendieno C y estoy leyendo un libro [...]

no entiendo como ocurre el ordenamiento, disculpen soy novato...
En la pagina cortesía de Wikipedia: Bubble sort Analysis hay una pequeña animación que muestra el algoritmo en funcionamiento, paso a paso.

Otra pagina de interés, en mi opinión la que explica (en ingles) de forma mas sencilla ciertos algoritmos es Animations to Assist Learning Some Key Computer Science Topics, primera sección "Algorithms".

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

barnix456

"No temo a los ordenadores; lo que temo es quedarme sin ellos"

Isaac Asimov

Adrisim

Vale, te explicaré qué hace exactamente el Método de la Burbuja.

El Método de la Burbuja consiste en hacer comparaciones entre los elementos del arreglo. Si el primer elemento es mayor al siguiente, entonces, lo intercambiará, sino, lo dejará como está.

La Burbuja, hará sólamente ''n-1'' pasadas, o comparaciones, puesto que si hiciera la cantidad de comparaciones del tamaño del arreglo, tomaría elementos basura que no están declarados dentro de las dimensiones del arreglo. ¿Esto por qué?. Porque el Método va comparando elementos de dos en dos.

Como primer comentario, te puedo decir que has utilizado variables de más; es decir, innecesarias. Con la varible entera ''i'' que declaraste, hubiese sido suficiente para recorrer los índices del arreglo en cada FOR. Pero entiendo por qué lo hiciste, para no confundirte. Ya después te acostumbrarás a no utilizar tantas variables.

En fin.

Veo que has iniciado tu arreglo.

Entonces:


// Tu variable 'pass' en el FOR es lo que recorrerá el índica entre corchetes de cada elemento del arreglo.

a[0] = 2
a[1] = 6
a[2] = 4
a[3] = 8
a[4] = 10
a[5] = 12
a[6] = 89
a[7] = 68
a[8] = 45
a[9] = 37

// El método de la burbuja, se trata de comparar elementos de dos en dos. Por eso el IF está escrito así:

if (a[pass] > a[pass]+1)

// Teniendo en consideración que ''pass'' empezará en 0 y preguntará si éste, es mayor a ''pass (0) +1'', es decir, 1.
// Recuerda que éstos solamente son el incremento de los indices. Lo que en realidad está comparando es si ''a[0] = 2 > a[1] = 6''.

// Como en los primeros dos elementos, la condición no se cumple, pasa a los siguientes dos; es decir: ''a[1] = 6 > a[2] = 4''.

// En este caso, la condición del IF sí se cumple. Entonces, aquí necesitamos una variable auxiliar, que guardará el valor previo del elemento del arreglo que vamos a intercambiar, porque si no lo hacemos así, entonces éste valor se perdería.

// Así, tenemos que ''a[1] = 6'' será asignado a tu varible ''hold'', quedando así: ''hold = 6''. Ahora, lo que se hace después, es asignarle el valor de ''a[2] = 4'', a ''a[1] = 6'', teniendo ahora que ''a[1] = 4''. Y el valor que le otorgamos a ''hold'' en un principio, será el nuevo valor que tomará ''a[2]'', siendo ''a[2] = 6''. Quedando así, ordenado de forma ascendente.

// Lo mismo hará con todos los elementos del arreglo.


Espero que te haya servido. Si no, puedes contactarme o checar alguna otra fuente para entenderle mejor.

Suerte.

rir3760

Cita de: Adrisim en  7 Diciembre 2012, 13:18 PMComo primer comentario, te puedo decir que has utilizado variables de más; es decir, innecesarias. Con la varible entera ''i'' que declaraste, hubiese sido suficiente para recorrer los índices del arreglo en cada FOR. Pero entiendo por qué lo hiciste, para no confundirte. Ya después te acostumbrarás a no utilizar tantas variables.
El numero de variables para el algoritmo en el programa de barnix456 es el mínimo: una para controlar el bucle externo y otra para el interno.

Otra opción para estudiar el algoritmo es revisar el código fuente sobre este en los foros, solo debe utilizar el motor de búsqueda, por ejemplo uno de los últimos temas donde se trata BubbleSort es Problemas al intentar hacer mas eficiente un algoritmo de ordenacion.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Adrisim

Cita de: rir3760 en  7 Diciembre 2012, 16:50 PM
El numero de variables para el algoritmo en el programa de barnix456 es el mínimo: una para controlar el bucle externo y otra para el interno.

Tienes razón. Cometí un error fatal. Por poco le hice creer al chico que podría hacer más con menos, cuando ya había llenado perfectamente, el perfil de un programa funcional.

Discúlpenme ambos.


barnix456

Hola Adrisim muy muy buena tu explicacion, parece que le he entendido, pero como dice rir3760 lo que tengo que hacer es ver mas ejemplos para poder entender mas el metodo burbuja, gracias por sus respuestas me han ayudado muchisimo, gracias.
"No temo a los ordenadores; lo que temo es quedarme sin ellos"

Isaac Asimov