Donald Knuth de El Arte de la Programación de Computadoras, volumen 3 tiene una sección sobre este tema exactamente dónde poner. No tengo los libros aquí conmigo, pero estoy bastante seguro de que Knuth presenta el algoritmo para 5 elementos. Como sospecha, no existe un algoritmo general que proporcione el número mínimo de comparaciones para muchos tamaños, pero hay una serie de trucos comunes que se utilizan en dichos algoritmos.
De recuerdos vagos, reconstruí el algoritmo para 5 elementos, y se puede hacer en 7 comparaciones. Primero, toma dos pares separados, compara los que están dentro de ellos y compara los más pequeños de cada par. Luego, compara el restante con el más grande de estos.Esto ahora se divide en dos casos según si el elemento restante fue más pequeño o más grande, pero en todos los casos es posible finalizar en las tres comparaciones disponibles.
Recomiendo hacer dibujos para ayudarlo. fotos de Knuth son algo como esto:
o---o
/
o---o
que muestra los resultados después de las tres primeras comparaciones (y de lo que recuerdo, este tipo de una imagen aparece en muchos tipos mínimos de comparación). Una línea conecta dos elementos cuyo orden conocemos. Tener tales imágenes lo ayuda a determinar con qué elementos comparar, ya que quiere hacer una comparación que le proporcione la cantidad máxima de información.
Addendum: Como hay una respuesta aceptada con el código actual, supongo que no hay nada malo en terminar estos diagramas, y podrían ser una adición útil a la respuesta. Por lo tanto, comience con el anterior y compare el elemento que falta con el de la esquina superior izquierda. Si es mayor, esto conducirá a
/--o
o
/\--o
o
\--o
Ahora, comparar los dos elementos de grandes dimensiones en la parte superior derecha y nos encontramos con
o---o---o
/
o---o
Ahora, comparando el elemento inferior derecha primero contra el medio en la parte superior y luego contra cualquier lado al que pertenezca, lo colocamos correctamente usando las dos comparaciones restantes.
Si la comparación inicial dio como resultado el elemento restante es más pequeño, se convierte en el diagrama
o---o---o
/
o---o
Ahora, compare las dos que tienen sin embargo, nada más pequeño que ellos. Una opción es el último diagrama anterior, que se puede resolver con las dos comparaciones restantes. El otro caso es
o---o
/
o---o---o
Y aquí de nuevo, el que todavía no está en secuencia con los otros pueden ser colocados correctamente con dos comparaciones.
Existe una manera más fácil de probar que se necesitan al menos 7 comparaciones. Hay (5!) = 120 permutaciones de 5 elementos, y (2 ** 7) = 128 resultados diferentes para 7 comparaciones. –
+1, para una pregunta bien formulada que expresa el problema claramente, muestra lo que has hecho hasta ahora y, lo que es más importante, menciona que se trata de tareas. – MAK
http://www.drdobbs.com/sorting-networks/184402663 parece indicar que se necesitan 9 comparaciones ... ¿tal vez porque es viejo? –