/*[b]Definicion de la estructura o tipo de dato[/b]*/
struct Data
{
struct Data *Pre;
int info;
struct Data *Post;
};
/*una vez definida es necesario llenarla con datos lo cual se hace en otra funcion
[b]Algoritmo quicksort[/b]
Este recive una estructura con datos y los ordena*/
void INquicksort(struct Data *rider,int desde,int hasta)
{
int izq,der,cont,CRUCE=0;
struct Data *IZQ,*DER,*DESDE,*HASTA;
if(desde<hasta)//si el array o subarray es mayor a 1 item
{ // Valores iniciles de la b£squeda.
cont=Counter(rider);
izq=desde+1;
der=hasta;
IZQ=(struct Data *)MoveToN(rider,izq);
DESDE=(struct Data *)MoveToN(rider,desde);
DER=HASTA=(struct Data *)MoveToN(rider,hasta);
while(!CRUCE)
{
while(IZQ!=HASTA && IZQ->info<=DESDE->info)//busqueda de un # mayor
{
IZQ=IZQ->Post;
}
while(DER!=DESDE && DER->info>=DESDE->info)//busqueda de un # menor
{
DER=DER->Pre;
}
if(MyNumber(IZQ)<MyNumber(DER)) // si no se han cruzado:
{
IZQ->info+=DER->info; // Intercambiar.
DER->info=IZQ->info-DER->info;
IZQ->info-=DER->info;
}
else // si se han cruzado:
CRUCE=1;// salir del bucle.
}
//el m s peque¤o, desde se cambia con ‚l menor encontrado.
if(DER!=DESDE)
{
DER->info+=DESDE->info;// Colocar el pivote
DESDE->info=DER->info-DESDE->info; // en su posici¢n.
DER->info-=DESDE->info;
}
if(MyNumber(DER)!=1)
INquicksort(rider,desde,MyNumber(DER->Pre)); // Ordenar el primer array.
if(MyNumber(DER)!=cont)
INquicksort(rider,MyNumber(DER->Post),hasta); // Ordenar el segundo array.
}
}
/*[b]Funciones Complementarias para manejar la estructura[/b]
Deja el apuntador de una estructura en el primer registro*/
struct Data *GoFirst(struct Data *dat)
{
while(dat->Pre!=NULL)
dat=dat->Pre;
return dat;
}
/*Funcion para pruebas de datos
lo que hace es imprimir
una estructura de tipo Data->info
En pantalla*/
void PrintGDF(struct Data *MyPrint)
{
MyPrint=(struct Data *)GoFirst(MyPrint);
while (MyPrint->Post!=NULL)
{
printf("%dn",MyPrint->info);
MyPrint=MyPrint->Post;
}
}
/*Devuelve el numero de nodos de la estructura*/
int Counter(struct Data *items)
{
int cont=0;
items=(struct Data *)GoFirst(items);
while(items->Post!=NULL)
{
cont++;
items=items->Post;
}
return cont;
}
//devuelve el numero del nodo actual.
int MyNumber(struct Data *items)
{
int cont=1;
struct Data *aux;
aux=(struct Data *)GoFirst(items);
while(aux!=items)
{
cont++;
aux=aux->Post;
}
return cont;
}
//cambia el apuntador a la posicion indicada.
struct Data *MoveToN(struct Data *items,int GoToNumber)
{
items=(struct Data *)GoFirst(items);
int i;
for(i=1;i<GoToNumber;i++)
items=items->Post;
return items;
}