Mostrando entradas con la etiqueta Metodos de Ordenacion. Mostrar todas las entradas
Mostrando entradas con la etiqueta Metodos de Ordenacion. Mostrar todas las entradas

domingo, 20 de enero de 2008

Método de Ordenación Batcher en Lenguaje C

void Metodo1 (int vec[], int n, int *ncomp, int *nmov, float *tiempo)
{
int tope,paso,mitad,ultpaso,distancia,aux,exp,i,t1,t2;
float total;
t1=clock();
*ncomp=0; /*Inicializo nmov y ncomp a 0 para que no hallan errores por acumulacion*/
*nmov=0; /*al repetir el metodo varias veces*/
exp= ceil (log(n)/log(2)); /*ceil = redondeo superior*/
tope=1< paso= tope;
while (paso != 0)
{
distancia= paso;
mitad= tope;
ultpaso= 0;
while(mitad >= paso)
{
for (i=0;i<(n-distancia); i++)
{
if ((i&paso)==ultpaso) /*& = and binario*/
{
*ncomp=*ncomp+1;
if (vec[i]>vec[i+distancia])
{
aux= vec[i+distancia];
vec[i+distancia]= vec[i];
vec[i]= aux;
*nmov=*nmov+2;
}
}
}
distancia= mitad-paso;
ultpaso= paso;
mitad= mitad/2;
}
paso=paso/2;
}
t2=clock();
*tiempo=((float)(t2-t1))/CLOCKS_PER_SEC;
}

Método de Ordenación Por Dígitos en Lenguaje C

/*La función NDigitos devuelve el número de dígitos mayor de los elementos del vector que se le pasa v, de tamaño n.
El mecanismo que se utiliza es sucesivas divisiones entre 10 de cada uno de los elementos del vector para obtener el número de dígitos*/
int NDigitos(int *v, int n)
{
int Contador, Maximo, i;
float Dato;
Maximo=0; /*Se inicializa el número de digitos máximo a 0*/
for (i=0;i {
Dato = (float)(fabs(v[i])); /*Se obtiene su valor absoluto*/
if ((Dato==0)||(Dato==1)) /*En caso de que sea el valor 0 o 1 el número de digitos será 1*/
Contador=1;
Contador=0; /*Se inicializa el numero de digitos del valor a 0*/
while (Dato>1) /*Mientras que el valor sea mayor que 1*/
{
Dato = Dato / 10; /*se va dividiendo entre 10*/
Contador = Contador + 1; /*y se incrementa el número de digitos del valor en 1*/
}
if (Contador>Maximo) /*Si el número de dígitos del valor es mayor que el máximo acumulado, éste pasa a ser el máximo*/
Maximo = Contador;
}
return Maximo; /*Se devuelve el número de dígitos mayor de los elementos del vector*/
}


/*Implementación del metodo1 (Ordenación por Dígitos)*/
/*La ordenación por dígitos consiste en realizar susecivas ordenaciones (dispersión), con respecto
a los dígitos que componen los elementos del vector de entrada, desde el menos al más significativo*/

void Metodo1(int vec[], int n, int *ncomp, int *nmov, float *tiempo)
{
int varaux, varaux1,nd,cadadigito,i,key,digito,*vecs,*cont,cadaelemento,colocador, taux, taux2;
taux=clock();
*ncomp=0;
*nmov=0;
vecs = (int*)malloc(n*sizeof(int)); /*Se necesita crear un vector auxiliar del mismo tamaño que el vector dado*/
if (vecs != NULL)
{
cont = (int*)malloc(11*sizeof(int)); /*También se necesita otro vector auxiliar de 11 elementos*/
if (cont != NULL)
{
nd = NDigitos(vec,n); /*Se calcula el número de dígitos mayor de los elementos del vector*/
varaux = 1;
varaux1 = 10;
for(cadadigito=0;cadadigito {
for(i=1;i<11;i++)
{
cont[i]=0;
}
for (cadaelemento=0;cadaelemento {
key = vec[cadaelemento];
digito = (key%varaux1)/varaux;
cont[digito+1] = cont[digito+1] + 1;
}
cont[0]=1;
for(i=1;i<10;i++)
{
cont[i] = cont[i] + cont[i-1];
}
for (cadaelemento=0;cadaelemento {
key = vec[cadaelemento];
digito = (key%varaux1)/varaux;
colocador = cont[digito];
vecs[colocador-1] = key;
*nmov=*nmov+1;
cont[digito] = cont[digito]+1;
}
for(i=0;i {
vec[i]=vecs[i];
*nmov=*nmov+1;
}
varaux = varaux1;
varaux1 = varaux1 * 10;
}
}
}
free(cont); /*Se libera la memoria requerida*/
free(vecs); /*Se libera la memoria requerida*/
taux2=clock();
*tiempo=((float)(taux2-taux))/CLOCKS_PER_SEC; /*Cálculo del tiempo de ejecución del metodo de ordenación*/
}

Método de Ordenación Intercambio de Parejas en Lenguaje C

void intparejas (int *vec,int n,int *comp,int *inter)
{
int i,j,cambio,aux;
float compara=0,intercambio=0;

for (j=0;j {
cambio=0;
for (i=((j+1)% 2);i<(n-1);i=i+2)
{
compara++;
if (vec[i]>vec[i+1])
{
aux=vec[i];
vec[i]=vec[i+1];
vec[i+1]=aux;
intercambio++;
cambio=1;
}
}

if ((cambio==0)&&(j>0))
{
*comp=compara;
*inter=intercambio;

return;
}
}
*comp=compara;
*inter=intercambio;
}

Método de Ordenación Fusión Natural en Lenguaje C

void fusion_natural(int *vec,int n,int *comp,int *mov)
{
int cambio=1,lizq,lder,lsal,i;
int otral,movlizq,movlsal,aux,*auxvec;
float compara=0,movimiento=0;

while (cambio==1)
{
auxvec=(int *)(malloc(n*sizeof(int)));
cambio=0;
lizq=0;
lder=n-1;
lsal=0;
otral=n-1;
movlizq=1;
movlsal=1;
while(lizq != lder)
{
compara++;
if (vec[lizq]>vec[lder])
{
aux=lizq;
lizq=lder;
lder=aux;
movlizq=-movlizq;
}
auxvec[lsal]=vec[lizq];
movimiento++;
lsal=lsal+movlsal;
lizq=lizq+movlizq;
compara++;
if (vec[lizq-movlizq]>vec[lizq])
{
compara++;
while (vec[lder+movlizq] <= vec[lder])
{
auxvec[lsal]=vec[lder];
movimiento++;
lsal=lsal+movlsal;
lder=lder-movlizq;
}
cambio=1;
movlsal=-movlsal;
aux=lsal;
lsal=otral;
otral=aux;
}
}
auxvec[lsal]=vec[lizq];
movimiento++;
for(i=0;i {
vec[i]=auxvec[i];
movimiento++;
}
}
*comp=compara;
*mov=movimiento;
}

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 */

Método de Ordenación Burbuja en Lenguaje C

void cburbuja(int vec[],int n,long int *ncomp,long int *nmov,float *tiempo)
{
float tempini= clock();
float tempfinal;
int alta=2;
int baja=n;
int aux,k,j;
*ncomp=0;
*nmov=0;
while(alta<=baja){
k=baja;
for(j=baja;j>=alta-1;j--){
(*ncomp)++;
if(vec[j-1]>vec[j]){
aux=vec[j];
vec[j]=vec[j-1];
vec[j-1]=aux;
*nmov=*nmov+2;
k=j;
}
}
alta=k+1;
if(alta<=baja){
k=alta;
for(j=alta-1;j<=baja;j++){
(*ncomp)++;
if(vec[j-1]>vec[j]){
aux=vec[j];
vec[j]=vec[j-1];
vec[j-1]=aux;
*nmov=*nmov+2;
k=j;
}
}
baja=k-1;
}
}
tempfinal= clock();
*tiempo=((float)(tempfinal-tempini)/(float)(CLK_TCK));
}

Método de Ordenación Por Torneo Con Minimización del Espacio de Trabajo en Lenguaje C

void metodo1(int vec[], int n, int *ncomp, int *nmov, float *tiempo)
{
int k=0,var=0,Initemp,Fintemp;
Initemp=clock();
/*Primer paso*/
for (k=n/2;k==2;k--)
{
desciende(vec,k,n,ncomp,nmov);
*ncomp=*ncomp+1;
}
/*Segundo paso*/
for (k=n;k==2;k--)
{
desciende(vec,1,n,ncomp,nmov);
var=vec[0];
vec[0]=vec[k];
vec[k]=var;
*nmov=*nmov+2;
*ncomp=*ncomp+1;
}
Fintemp=clock();
Fintemp-=Initemp;
*tiempo=(float)Fintemp/CLOCKS_PER_SEC;
return;
}

void desciende (int vec[],int ini,int fin,int *ncomp,int *nmov)
{
int padre,hijo,save;
padre=ini;
hijo=2*padre;
save=vec[padre];
while (hijo<=fin)
{
if (hijo {
*ncomp=*ncomp+1;
if (vec[hijo] {
*ncomp=*ncomp+1;
hijo=hijo+1;
}
}
if (save>=vec[hijo])
{
*ncomp=*ncomp+1;
*nmov=*nmov+1;
vec[padre]=save;
return;
}
else
{
*ncomp=*ncomp+1;
*nmov=*nmov+1;
vec[padre]=vec[hijo];
padre=hijo;
hijo=2*padre;
}
}
vec[padre]=save;
*nmov=*nmov+1;
return;
}

Método de Ordenación Selección Lineal en Lenguaje C

void metodo2(int vec[], int n, int *ncomp, int *nmov, float *tiempo)
{
int *vec2,Initemp,Fintemp,i,j,min,pos;
vec2=(int*)malloc(n*sizeof(int));
Initemp=clock();

for (i=0;i {
pos=0;
min=vec[0];
for(j=1;j {
if (vec[j] {
min=vec[j];
pos=j;
}
*ncomp=*ncomp+1;
}
vec2[i]=min;
vec[pos]=INT_MAX;
*nmov=*nmov+2;
*ncomp=*ncomp+1;
}

for(i=0;i {
vec[i]=vec2[i];
*nmov=*nmov+1;
}

free(vec2);
Fintemp=clock();
Fintemp-=Initemp;
*tiempo=(float)Fintemp/CLOCKS_PER_SEC;
return;
}

Método de Ordenación Comparación de Contadores en Lenguaje C

void ComparacionContadores (int vec[] ,int vecs[],int n,double *comparaciones, double *movimientos)
{
int cont[40000], i , j;
for (i=0;i {
cont[i]=0;
}
for (i=0;i {
for (j=i+1;j {
*comparaciones=*comparaciones+1;
if (vec[j] {
*movimientos=*movimientos+1;
cont[i]=cont[i]+1;
}
else
{
*movimientos=*movimientos+1;
cont[j]=cont[j]+1;
}
}
}
/*Segunda parte */
for(i=0;i vecs[cont[i]]=vec[i];
*movimientos=*movimientos+1;
}
}

Método de Ordenación División e Intercambio recursivo en Lenguaje C

/*Funcion Division: Funcionamiento:
Se tiene un vector vec con limites linf (inferior) y lsup (superior). Se necesitan dos
indicadores: uno que señala inicialmente el principio del vector pini <- linf y otro que indica el final pfin <- lsup. Como elemento pivote se utilizará uno escogido aleatoriamente. El índice pini recorre el vector de izquierda a derecha hasta encontrar un elemento que sea mayor que el del pivote. De la misma forma y a partir del final el índice pfin se desplaza hasta encontrar un elemento menor que el del pivote. Si pinipfin. El proceso de partir el vector acabará intercambiando el elemento pivote con el elemento pini, si pini es menor que pivote, o con el elemento pfin si pivote es menor que pfin.*/

void division (int *vec, int linf, int lsup, int *pini, int *pfin, int *ncomp, int *nmov)
{
int pivote, aux;
/*random devuelve un valor aleatorio entre linf y lsup, ambos inclusive */
pivote = linf + rand () % (lsup - linf + 1);
*pini = linf;
*pfin = lsup;
while (*pini <= *pfin)
{
while ((*pini <= lsup) && (*ncomp = *ncomp + 1, vec[*pini] <= vec[pivote]))
*pini = *pini + 1;
while ((*pfin >= linf) && (*ncomp = *ncomp + 1, vec[*pfin] >= vec[pivote]))
*pfin = *pfin - 1;
if (*pini < *pfin)
{
aux = vec[*pini];
vec[*pini] = vec[*pfin];
vec[*pfin] = aux;
*nmov = *nmov + 2; /* Un intercambio son dos movimientos */
*pini = *pini + 1;
*pfin = *pfin - 1;
}
}
if (*pini < pivote)
{
aux = vec[*pini];
vec[*pini] = vec[pivote];
vec[pivote] = aux;
*nmov = *nmov + 2;/* Un intercambio son dos movimientos */
*pini = *pini + 1;
}
else
{
if (*pfin > pivote)
{
aux = vec[pivote];
vec[pivote] = vec[*pfin];
vec[*pfin] = aux;
*nmov = *nmov + 2;/* Un intercambio son dos movimientos */
*pfin = *pfin - 1;
}
}
}
void divinter (int *vec, int linf, int lsup, int *ncomp, int *nmov)
{
/*declaracion de variables*/
int pinicial = 0, pfinal = 0, aux;
if (linf < lsup - 1)
{
/*Llamadas recursivas*/
division (vec, linf, lsup, &pinicial, &pfinal, ncomp, nmov);
divinter (vec, linf, pfinal, ncomp, nmov);
divinter (vec, pinicial, lsup, ncomp, nmov);
}
else
{
if (lsup - linf == 1)
{
if (*ncomp = *ncomp + 1, vec[lsup] < vec[linf]) /* Una comparacion mas */
{
aux = vec[lsup];
vec[lsup] = vec[linf];
vec[linf] = aux;
*nmov = *nmov + 2;/* Un intercambio son dos movimientos */
}
}
}
}
/* Utilizamos este procedimiento como puente */
void metodo1 (int *vec, int n, int *ncomp, int *nmov, float *tiempo)
{
float tiempo1;
tiempo1 = clock ();
*ncomp = 0;*nmov = 0;*tiempo = 0;
divinter (vec, 0, n - 1, ncomp, nmov);
/* El número de pulsos dividido por CLOCKS_PER_SEC da el resultado en
segundos pudiéndose aprovechar los decimales*/
*tiempo = (float) (clock () - tiempo1) / CLOCKS_PER_SEC;
}

Método de Ordenación Selección Cuadrática en Lenguaje C

/*METODO DE ORDENACION SELECCION CUADRATICA: FUNCIONAMIENTO:

La lista de entrada, con n elementos, se divide en raíz cuadrada de n sublistas, cada una con raíz de n elementos, si n no es cuadrado perfecto las sublistas no cubren todos los elemento teniendo que incrementar en uno el número de elementos e incluso el número de particiones. Cada sublista es objeto de una selección lineal, donde se busca el elemento más pequeño. Estos elementos se transfieren a una lista auxiliar, y en su lugar en la lista de entrada, se coloca el número máximo posible. Cada elemento de la lista auxiliar esta asociado a una sublista. En la lista auxiliar se realiza a continuación otra selección lineal en busca del elemento más pequeño, que se transferirá a la lista de salida, siendo ocupada su posición por el siguiente elemento más pequeño de la sublista a la cual pertenece. El proceso continua hasta que se haya llenado la lista de salida. */

void selpart (int vec[], int n, int aux[], int nele, int part, int *ncomp, int *nmov)
{
/*Declaracion de variables*/
int primero, ultimo, elem, pos, menor;

primero = (part - 1) * nele;
if (nele * part < n)
ultimo = nele * part - 1;
else
ultimo = n - 1;
pos = primero;
menor = vec[primero];
for (elem = primero + 1; elem <= ultimo; elem++)
{
if ((*ncomp)++, vec[elem] < menor)/*hacemos una comparacion mas*/
{
menor = vec[elem];
pos = elem;
}
}
aux[part - 1] = menor;
/*hacemos un movimiento mas*/
(*nmov)++;
vec[pos] = INT_MAX;
}

void metodo2 (int vec[], int n, int *ncomp, int *nmov, float *tiempo)
{
/*declaracion de variables*/
int *aux, nelement, npart, m, part, menor, *vecs, e;
aux = (int *) malloc (((int)(sqrt(n)+1))*sizeof(int));
vecs = (int *) malloc (n*sizeof(int));
*tiempo = (float) clock ();
(*ncomp) = (*nmov) = 0;
/*El numero de parte y el numero de elementos es la raiz cuadrada del tamaño del ejemplar*/
nelement = npart = sqrt (n);
/*miramos si n es un cuadrado perfecto*/
if (nelement * npart < n)
{
/*sino lo es, no cubre todos los elementos, y por eso incrementamos en 1 el numero de elementos*/
nelement = nelement + 1;
if (npart * nelement < n)
{
/*como no es cuadrado perfecto habra una parte mas*/
npart = npart + 1;
}
}
/*recorremos todas las partes y llamamos a selpart*/
for (part = 1; part <= npart; part++)
selpart (vec, n, aux, nelement, part, ncomp, nmov);
/*y buscamos el menor de cada parte y lo colocamos en aux*/
for (m = 0; m <= n - 1; m++)
{
menor = aux[0];
part = 1;
/*buscamos el menor de aux y lo colocamos en el vector final, vecs*/
for (e = 1; e <= npart; e++)
{
if ((*ncomp)++, aux[e - 1] < menor)/*hacemos una comparacion mas*/
{
menor = aux[e - 1];
part = e;
}
}
vecs[m] = menor;
(*nmov)++;/*hacemos un movimiento mas*/
selpart (vec, n, aux, nelement, part, ncomp, nmov);
}
for (m = 0; m < n; m++)
{
vec[m] = vecs[m];
}
/* El número de pulsos dividido por CLOCKS_PER_SEC da el resultado en
segundos pudiéndose aprovechar los decimales*/
*tiempo = (((float) clock ()) - *tiempo) / CLOCKS_PER_SEC;
/*Liberamos el vector intermedio y el vector final*/
free(aux);
free(vecs);
}