Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Beginner Web en 8 Junio 2019, 10:42 am



Título: duda algoritmo
Publicado por: Beginner Web en 8 Junio 2019, 10:42 am
Bueno  queria saber si puedo resumir mas el algoritmo quick sort de 27 lineas para que no sea tan largo y hacerlo similar al de bogosort pero sin trampa, el codigo de quicksort me lo se de memoria el de bogosort tambien  ;-)


Título: Re: quicksrot & bogosort
Publicado por: K-YreX en 8 Junio 2019, 13:21 pm
Hay infinidad de implementaciones para un mismo algoritmo por lo que puedes poner tu implementación y así es más fácil decirte si puedes simplificarlo más. La otra opción es esperar que alguien lo tenga más simplificado y te lo mande...
Y no sé a qué te refieres con "pero sin trampa". He supuesto que es a no poner varias instrucciones en una línea para reducir el número de líneas, motivo por el cual no es muy bueno medir la simplificación de un código por su número de líneas. :-X


Título: Re: quicksrot & bogosort
Publicado por: Serapis en 8 Junio 2019, 15:23 pm
Tal como te señala YreX-DwX, un algoritmo no se puede medir por su número de líneas.
A menudo un algoritmo que te funciona muy bien y es muy escueto, le acabas añadiendo el doble de líneas y luego resulta mucho más rápido.

En general el hecho de añadir alguna que otra línea, por ejemplo al asignar valores, puede que su ejecución solo sea pocas veces, y a cambio ahorre muchas ejecuciones dentro de un bucle.

Más bien considera algoritmos de líneas breves (aunque ineficiente) como solución para problemas pequeños... Por ejemplo el ordenamiento de burbuja es el más lento, pero para ordenar pequeñas colecciones de hasta unas decenas (no más de 50 elementos) todavía planta cara a los más eficientes.
Justo cuanto más cantidad de elementos deban ser ordenados tanto más importante se hace la eficiencia del algoritmo usado.

Por cierto el 'bogosort' (más bien bobo-sort), bajo mi punto de vista no es un algoritmo, de ordenamiento ni debiera aparecer por parte alguna.

Pon el código que tienes y se ve de hacerlo más eficiente...


Título: Re: quicksrot & bogosort
Publicado por: Beginner Web en 8 Junio 2019, 21:12 pm
lo se bebes, cuando decia sin trampa me referia justamente a eso, a no escribir todo en una sola linea de codigo, mi intencion es reducir los pasos y de esa manera hacerlo mas compacto porque todo se puede compactar tranquilamente solo que con este algoritmo no me sale  :laugh:

Código
  1. void quick_sort(arreglo &a, int izq, int der)
  2. {
  3. int i, j, pivote, aux;
  4. i=izq;
  5. j=der;
  6. pivote=a[(izq+der)/2];
  7. while(i<=j){
  8. while(a[i]<pivote)
  9. i++;
  10. while(a[j]>pivote)
  11. j--;
  12. if(i<=j){
  13. aux=a[i];
  14. a[i]=a[j];
  15. a[j]=aux;
  16. i++;
  17. j--;
  18. }
  19. }
  20. if(izq<j)
  21. quick_sort(a, izq, j);
  22. if(i<der)
  23. quick_sort(a, i, der);
  24. }



Título: Re: quicksrot & bogosort
Publicado por: K-YreX en 8 Junio 2019, 21:55 pm
Si quieres quitar líneas claro que puedes, a costa de perder legibilidad:
  • Las líneas 4, 5 y 6 las puedes poner junto a las declaraciones. (3 líneas menos)
  • Los <if> y <while> con una sola sentencia dentro, puedes quitar las llaves. (4 líneas menos)
  • Puedes cambiar un poco los incrementos. (8 líneas menos contando las 4 líneas menos anteriores)

Ganancias en eficiencia? Ninguna
Pérdidas en legibilidad? Muchas
 :rolleyes: :rolleyes: :rolleyes: :rolleyes:
Si quieres ganar un poco en eficiencia lo único que te diría es que los incrementos y decrementos los hagas en prefijo <++i> es ligeramente mejor que <i++>. Pero tampoco creas que te van a mejorar los tiempos de ordenación por hacer eso.