domingo, 20 de enero de 2008

Método de Ordenación de Shell en Lenguaje C

void shell (int vec[], int n, long int *comp, long int *mov)
/*************************************************************

METODO: METODO DE SHELL

VARIABLES DE ENTRADA/SALIDA: vec[], comp, mov
VARIABLES DE ENTRADA.......: n

**************************************************************/
{
int dist,i,j,aux, puntos, col;
long int c, m;

c = 0; /* c = numero de comparaciones */
m = 0; /* m = numero de movimientos */
puntos = 0; /* puntos = numero de puntos escritos */
col = n / 80; /* col = cada cuanto se debe poner un punto */

dist = n/2; /* hallamos la primera distancia */

while (dist > 0) /* mientras la distancia no sea cero */
{
for (i = 0 ; i < n-dist ; i++) /* i=primer elmto. comparaci¢n */
{
j = i + dist; /* j=segundo elmto. comparaci¢n */

while ((j >= dist) && (vec[j] < vec[j-dist]))
{
aux = vec[j];
vec[j] = vec[j-dist];
vec[j-dist] = aux;

j -= dist; /* para realizar las comparaciones secundarias*/

m += 2;
c++;
}
c++;

if ((i % col == 0) && (puntos < 80)) /* Para llevar un seguimiento */
{ /* del metodo y saber que no */
printf ("."); /* se ha colgado o cuanto le */
puntos++; /* le queda */
}
}
dist /= 2; /* hallamos la nueva distancia */
}

*comp = c;
*mov = m;
}
/* FIN shell */