• Viernes 17 de Mayo de 2024, 05:42

Autor Tema:  Re: Necesito conocer el funcionamiento interno del QuickSort  (Leído 4809 veces)

Marta

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: Necesito conocer el funcionamiento interno del QuickSort
« en: Miércoles 26 de Marzo de 2003, 00:47 »
0
¿se podría implementar la funcion del QuickSort sin utilizar un puntero a una funcion?
Podría ordenar strings, enteros, etc. sólo variando la funcion externa de comparación, no?
¿Podrías explicarmelo?

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Necesito conocer el funcionamiento interno del QuickSort
« Respuesta #1 en: Miércoles 26 de Marzo de 2003, 18:38 »
0
Claro que se puede...pero conoces el fuincionamiento básico del algoritmo?
es decir la ordenacion de enteros?

No es nada complicado lo que pides pero si un poco largo de hacer, lo del puntero es lo de menos, todo depende de como hagas tu aplicacion.
Obviamente la funcion de ordenamiento de enteros no te sirve para cadenas , por ello te pregunto si conoces bien el algoritmo , ya que hay que modificarlo segun tus necesidades.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Marta

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: Necesito conocer el funcionamiento interno del QuickSort
« Respuesta #2 en: Jueves 27 de Marzo de 2003, 01:16 »
0
Pero yo me refiero al funcionamiento interno, al codigo que no vemos. De todas formas, sabrías implementarlo para que ordene tanto strings como enteros?
Yo tengo implementado el q me ordena strings, pero con el de enteros me estoy peleando aun. Podías ayudarme.
Gracias por contestar de todas formas.

gmantil

  • Miembro MUY activo
  • ***
  • Mensajes: 121
    • Ver Perfil
Re: Necesito conocer el funcionamiento interno del QuickSort
« Respuesta #3 en: Viernes 28 de Marzo de 2003, 14:03 »
0
Hola Marta:
El funcionamiento del QuickSort es el siguiente:

Se calcula un indice a la mitad del vector a ordenar.

Se comparan los elementos de la izquierda contra ese elemento medio hasta encontrar un elemento mayor al de la mitad.

Se comparan los elementos de la derecha contra el mismo elemento medio citado arriba hasta encontrar un elemento menor al de la mitad.

Cuando tenemos un mayor a la izquierda y un menor a la derecha, los intercambiamos entre sí.

Volvemos a mirar los de la izquierda restantes contra el de la mitad bajo el mismo criterio anterior, igual hacemos con los de la derecha y volvemos a intercambiar.

Esto se repite en un ciclo hasta que el indice por izquierda supere o sea igual al indice por derecha.

Saliendo de este ciclo el llamado se hace de nuevo recursivo, primero por izquierda considerando un subvector entre el inicio del vector y el indice por derecha.

Luego se hace un llamado recursivo por derecha considerando un subvector desde el indice por izquierda y el limite del vector por derecha.

Este es el funcionamiento de este algoritmo de naturaleza recursivo. Si quieres convertirlo por ciclos, debes entender primero bien su naturaleza pura.

gmantil

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Necesito conocer el funcionamiento interno del QuickSort
« Respuesta #4 en: Domingo 30 de Marzo de 2003, 09:53 »
0
:alien:
No te entiendo aún... no conoces el algoritmo?.. te referias alo que respondio gmantill?

Por cierto, lo de hacerlo con punteros facilita muchisimo las cosas, seguramente que debe haber muchas otras formas de hacerlo , pero esta es la más efectiva y natural, de todos modos los limites los puedes vencer, sino te gusta hacerlo con punteros,,, tendras que quemarte la cabeza como 1000 veces para implementar el algoritmo con otro sistema
en todo caso... aqui te anexo una página donde encontraras una referencia del algoritmo basico, nuevamente su explicacion,ejemplo y codigo fuente,  todo esto para trabajo con arays de enteros de longitud fija, no exactamente con punteros, ya que se mueven de una manera mucho más natural por ser en un array estatico:
http://galeon.com/analisisdealgoritmos/ ... 28098.html

Sin embargo, si te interesa, estoy trabajando por ahi en un software educativo, y para lo cual necesite algo de trabajo con el QuickSort y con solo apuntadores, asi que no le veo inconveniente, al publicar el segmento correspondiente al mismo.
El algoritmo realiza el ordenamiento quicksort a una estructura dinámica que almacena numeros enteros, segun como se ve en el siguiente código; adicionalemente utilizo algunas funciones adicionales que hice para facilitar el trabajo:
 
Código: Text
  1.  
  2. /*[b]Definicion de la estructura o tipo de dato[/b]*/
  3.  
  4. struct Data
  5. {
  6.    struct Data *Pre;
  7.    int info;
  8.    struct Data *Post;
  9. };
  10. /*una vez definida es necesario llenarla con datos lo cual se hace en otra funcion
  11. [b]Algoritmo quicksort[/b]
  12. Este  recive una estructura con datos y los ordena*/
  13. void INquicksort(struct Data *rider,int desde,int hasta)
  14. {
  15.   int izq,der,cont,CRUCE=0;
  16.   struct Data *IZQ,*DER,*DESDE,*HASTA;
  17.  
  18.   if(desde<hasta)//si el array o subarray es mayor a 1 item
  19.   { // Valores iniciles de la b£squeda.
  20.     cont=Counter(rider);
  21.     izq=desde+1;
  22.     der=hasta;
  23.     IZQ=(struct Data *)MoveToN(rider,izq);
  24.     DESDE=(struct Data *)MoveToN(rider,desde);
  25.     DER=HASTA=(struct Data *)MoveToN(rider,hasta);
  26.     while(!CRUCE)
  27.     {
  28.       while(IZQ!=HASTA && IZQ->info<=DESDE->info)//busqueda de un # mayor
  29.       {
  30.         IZQ=IZQ->Post;
  31.       }
  32.       while(DER!=DESDE && DER->info>=DESDE->info)//busqueda de un # menor
  33.       {
  34.         DER=DER->Pre;
  35.       }
  36.       if(MyNumber(IZQ)<MyNumber(DER)) // si no se han cruzado:
  37.       {
  38.         IZQ->info+=DER->info; // Intercambiar.
  39.         DER->info=IZQ->info-DER->info;
  40.         IZQ->info-=DER->info;
  41.       }
  42.       else // si se han cruzado:
  43.        CRUCE=1;// salir del bucle.
  44.     }
  45.     //el m s peque¤o, desde se cambia con ‚l menor encontrado.
  46.     if(DER!=DESDE)
  47.     {
  48.       DER->info+=DESDE->info;// Colocar el pivote
  49.       DESDE->info=DER->info-DESDE->info; // en su posici¢n.
  50.       DER->info-=DESDE->info;
  51.     }
  52.     if(MyNumber(DER)!=1)
  53.       INquicksort(rider,desde,MyNumber(DER->Pre)); // Ordenar el primer array.
  54.     if(MyNumber(DER)!=cont)
  55.       INquicksort(rider,MyNumber(DER->Post),hasta); // Ordenar el segundo array.
  56.   }
  57. }
  58.  
  59. /*[b]Funciones Complementarias para manejar la estructura[/b]
  60.  
  61. Deja el apuntador de una estructura en el primer registro*/
  62. struct Data *GoFirst(struct Data *dat)
  63. {
  64.   while(dat->Pre!=NULL)
  65.     dat=dat->Pre;
  66.   return dat;
  67. }
  68.  
  69. /*Funcion para pruebas de datos
  70.   lo que hace es imprimir
  71.   una estructura de tipo Data->info
  72.   En pantalla*/
  73. void PrintGDF(struct Data *MyPrint)
  74. {
  75.  MyPrint=(struct Data *)GoFirst(MyPrint);
  76.  while (MyPrint->Post!=NULL)
  77.  {
  78.    printf("%dn",MyPrint->info);
  79.    MyPrint=MyPrint->Post;
  80.  }
  81. }
  82.  
  83. /*Devuelve el numero de nodos de la estructura*/
  84. int Counter(struct Data *items)
  85. {
  86.   int cont=0;
  87.   items=(struct Data *)GoFirst(items);
  88.  
  89.   while(items->Post!=NULL)
  90.   {
  91.     cont++;
  92.     items=items->Post;
  93.   }
  94.   return cont;
  95. }
  96.  
  97. //devuelve el numero del nodo actual.
  98. int MyNumber(struct Data *items)
  99. {
  100.   int cont=1;
  101.   struct Data *aux;
  102.   aux=(struct Data *)GoFirst(items);
  103.   while(aux!=items)
  104.   {
  105.     cont++;
  106.     aux=aux->Post;
  107.   }
  108.   return cont;
  109. }
  110.  
  111. //cambia el apuntador a la posicion indicada.
  112. struct Data *MoveToN(struct Data *items,int GoToNumber)
  113. {
  114.   items=(struct Data *)GoFirst(items);
  115.   int i;
  116.   for(i=1;i<GoToNumber;i++)
  117.     items=items->Post;
  118.   return items;
  119. }
  120.  
  121.  

Espero que te sirva, mucha suerte con tu trabajo, por ahora me voy a descansar porque hoy he tenido mucho trabajo.. y mañana... es decri en unas horas... meespera aun mas trabajo..

Juank. -_-


:angel:nota: te recomeindo que para entenderlo , le realices una prueba de escritorio, con una estructura que apunte a un lista de 10 nodos sera suficiente para que puedas entender que es lo que hace.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io