ayuda con el shell sort c++

Iniciado por gibranini, 2 Agosto 2014, 05:40 AM

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

gibranini

hola estoy tratando de hacer el método de ordenamiento Shell Sort pero cuando lo ejecuto no me ordena nada y sigue igual,

int arreglo[7]={3, 34, 1, 53, 15, 6, 9};
    int i, dif, aux;
    float fact;

    fact= 3/4;
    dif= 6 * fact;

    while(dif > 0)
    {
        i= 0;
        while(i <= 6-dif)
        {
            if(arreglo[i] > arreglo[i+dif])
            {
                aux=arreglo[i];
                arreglo[i]=arreglo[i+dif];
                arreglo[i+dif]=aux;
            }

            i++;
        }
        dif=dif * fact;
    }

A.I.

fact = 3/4;

Probablemente te esté dando 0.

fact = (float) 3/4;

El algoritmo así visto por encima parece correcto.

gibranini

Cita de: A.I. en  2 Agosto 2014, 10:56 AM
fact = 3/4;

Probablemente te esté dando 0.

fact = (float) 3/4;

El algoritmo así visto por encima parece correcto.

entonces poniendo

fact = (float) 3/4;

deberia funcionar? por que sigue sin ordenar :-(

kutcher

Hola gibranini los números 3, 4, 6 de donde los sacaste

Saludos..

gibranini

el 3/4, lo hice para dividir el arreglo y asi comparar/ordenar por separado, y el 6 es el tamaño del arreglo -1

Blaster

#5
Cita de: gibranini en  2 Agosto 2014, 05:40 AM
hola estoy tratando de hacer el método de ordenamiento Shell Sort pero cuando lo ejecuto no me ordena nada y sigue igual,

Trato de respetar lo máximo posible la estructura de tu código:

Edito:

Código (cpp) [Seleccionar]
void shell_sort (int *arreglo, int n)
{
   int i, j, aux, inc;
   inc = n/2-1;

   while(inc > 0)
   {
       i = 0;
       while(i < n)
       {
           j = i, aux = arreglo[i];
           while (j >= inc && arreglo[j-inc] > aux)
           {
               arreglo[j] = arreglo[j-inc];
               j = j-inc;
           }
           arreglo[j] = aux, i++;
       }
       inc = inc/2;
   }
}


Edite el código anterior ya que me di cuenta de un error

A.I.

Cita de: gibranini en  2 Agosto 2014, 23:55 PM
entonces poniendo

fact = (float) 3/4;

deberia funcionar? por que sigue sin ordenar :-(

Sí que lo ordena.

Código (bash) [Seleccionar]
$ gcc shellsort.c -o shellsort
$ ./shellsort
3 34 1 53 15 6 9
1 3 6 9 15 34 53



leosansan

Cita de: A.I. en  3 Agosto 2014, 04:39 AM
Sí que lo ordena.

Código (bash) [Seleccionar]
$ gcc shellsort.c -o shellsort
$ ./shellsort
3 34 1 53 15 6 9
1 3 6 9 15 34 53



Totalmente de acuerdo con A.I. :

Código (cpp) [Seleccionar]
3   34    1   53   15    6    9
1    3    6    9   15   34   53

Process returned 0 (0x0)   execution
Press any key to continue.


¡¡¡¡ Saluditos! ..... !!!!



gibranini

Cita de: A.I. en  3 Agosto 2014, 04:39 AM
Sí que lo ordena.

Código (bash) [Seleccionar]
$ gcc shellsort.c -o shellsort
$ ./shellsort
3 34 1 53 15 6 9
1 3 6 9 15 34 53




tienes razon :) gracias, pero me puedes explicar por que razo se necesitaba poner el (float), porfavor :D ;D

leosansan

#9
Cita de: gibranini en  3 Agosto 2014, 23:15 PM
tienes razon :) gracias, pero me puedes explicar por que razo se necesitaba poner el (float), porfavor :D ;D

Porque como tan acertadamente te comentó A.I. 3/4 es una división entre enteros con lo que el resultado es cero:

Código (cpp) [Seleccionar]
fact = 3/4 =  0

Puedes evitarlo como te dijo A.I. :

Código (cpp) [Seleccionar]
fact = (float) 3/4 =  0.75

O más simple:

Código (cpp) [Seleccionar]
fact =  3./4 = 0.75

Fíjate en la presencia del punto decimal en el tres que indica que se va a realizar una operación entre números en flotante.

¡¡¡¡ Saluditos! ..... !!!!