/*METODO QUICK SORT (RECURSIVO)
**Preferible invocar la funcion void quicksort, lan cual se invoca de manera
**natural, es decir de la misma maner que los demas metodos.
**(ver m s abajo)*/
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.*/
}
}
/*llama a la funci¢n metodo INquicksort de manera natural.*/
void quicksort(struct Data *rider)
{
int desde=1,hasta=Counter(rider);
INquicksort(rider,desde,hasta);
}
/* \|||/
(o o)
-----ooO-(_)-Oooo-----*/