2010-10-11 8 views
11

Estoy buscando una implementación de red de clasificación de 5 elementos, pero como no pude encontrar una buena referencia en SO, me gustaría solicitar redes de clasificación para todos los valores pequeños de n, al menos n = 3 a n = 6 pero los valores más altos también serían excelentes. Una buena respuesta debería al menos enumerarlas como secuencias de operaciones de "intercambio" (ordenar en 2 elementos), pero también podría ser bueno ver la descomposición recursiva en términos de redes de clasificación de orden inferior.Redes de clasificación estándar para valores pequeños de n

Para mi aplicación, en realidad solo me importa la mediana de 5 elementos, sin ponerlos realmente en orden. Es decir, el orden de los otros 4 elementos puede no especificarse en el resultado siempre que la mediana termine en el lugar correcto. ¿Se puede utilizar un enfoque relacionado con las redes de clasificación para calcular la mediana con menos canjes que realizar una clasificación completa? Si es así, una solución de este tipo a mi problema (para n = 5) y para otros casos sería una gran respuesta también.

(Nota: he etiquetado esta pregunta C porque C es el idioma que uso y sospecho que las personas que siguen la etiqueta C tienen buenas respuestas, pero realmente no me importa si la respuesta está escrita en C en realidad pseudocódigo siempre que se traduzca fácilmente a C, lo que debería hacer naturalmente siempre que se cumplan los criterios mencionados anteriormente)

+0

¿Están vinculados los valores de los n elementos o son valores arbitrarios? – JoshD

+0

Son objetos opacos en los que se comparan y se intercambian las únicas operaciones, pero dado que 'n' es pequeño, una buena implementación sería usar una matriz de punteros/índices y realizar los intercambios en la matriz de punteros. –

+0

en lo que creo que estaba llegando JoshD, ¿son los valores _astronómicamente_ grandes, como valores con 10^999 números en ellos? De su respuesta, supongo que no, pero la pregunta es inteligente. –

Respuesta

13

Elija uno de cada sección, probablemente el que corra más rápido en su hardware ya que estamos firmemente en el ámbito de la "optimización diabólica": http://smarterrecall.com/networks.html, reproducido a continuación:

Creé este sitio para enumerar todas las redes óptimas de clasificación posibles hasta 6 entradas escritas usando un programa en matlab. El tiempo de ejecución más largo es para 5 entradas a 45 segundos. Si usted está interesado en contacto conmigo, puedo ser alcanzado en rpl1 [AT] arroz [dot] edu Saludos, Richard L.

---------- 

- 2-input: 1 network 

    [[1 2]] 


---------- 


- 3-input: 6 networks 

[[1 2][1 3][2 3]] 
[[1 2][2 3][1 2]] 
[[1 3][1 2][2 3]] 
[[1 3][2 3][1 2]] 
[[2 3][1 2][2 3]] 
[[2 3][1 3][1 2]] 


---------- 

- 4-input: 3 networks 

[[1 2][3 4][1 3][2 4][2 3]] 
[[1 3][2 4][1 2][3 4][2 3]] 
[[1 4][2 3][1 2][3 4][2 3]] 


---------- 

- 5-input: 180 networks 

    [[1 2][3 4][1 3][2 5][1 2][3 4][2 3][4 5][3 4]] 
    [[1 2][3 4][1 3][2 5][2 3][4 5][1 2][3 4][2 3]] 
    [[1 2][3 4][1 3][4 5][1 4][2 3][2 4][3 5][3 4]] 
    [[1 2][3 4][1 3][4 5][2 5][3 4][1 3][2 4][2 3]] 
    [[1 2][3 4][1 4][2 5][2 3][4 5][1 2][3 4][2 3]] 
    [[1 2][3 4][1 4][3 5][1 3][2 5][2 3][4 5][3 4]] 
    [[1 2][3 4][1 5][2 3][1 2][4 5][2 4][3 5][3 4]] 
    [[1 2][3 4][1 5][2 4][1 3][2 5][2 3][4 5][3 4]] 
    [[1 2][3 4][1 5][2 4][2 3][4 5][1 2][3 4][2 3]] 
    [[1 2][3 4][2 3][4 5][1 4][3 5][1 2][3 4][2 3]] 
    [[1 2][3 4][2 4][3 5][1 2][4 5][1 3][2 4][2 3]] 
    [[1 2][3 4][2 4][3 5][1 3][2 5][2 3][4 5][3 4]] 
    [[1 2][3 5][1 3][2 4][1 2][3 5][2 3][4 5][3 4]] 
    [[1 2][3 5][1 3][2 4][2 3][4 5][1 2][3 4][2 3]] 
    [[1 2][3 5][1 3][4 5][1 4][2 3][2 4][3 5][3 4]] 
    [[1 2][3 5][1 3][4 5][2 5][3 4][1 3][2 4][2 3]] 
    [[1 2][3 5][1 4][2 3][1 2][4 5][2 4][3 5][3 4]] 
    [[1 2][3 5][1 4][2 5][1 3][2 4][2 3][4 5][3 4]] 
    [[1 2][3 5][1 4][2 5][2 3][4 5][1 2][3 4][2 3]] 
    [[1 2][3 5][1 5][2 4][2 3][4 5][1 2][3 4][2 3]] 
    [[1 2][3 5][1 5][3 4][1 3][2 4][2 3][4 5][3 4]] 
    [[1 2][3 5][2 3][4 5][1 4][3 5][1 2][3 4][2 3]] 
    [[1 2][3 5][2 5][3 4][1 2][4 5][1 3][2 4][2 3]] 
    [[1 2][3 5][2 5][3 4][1 3][2 4][2 3][4 5][3 4]] 
    [[1 2][4 5][1 3][2 4][1 2][3 5][2 3][4 5][3 4]] 
    [[1 2][4 5][1 3][2 5][1 4][2 3][2 4][3 5][3 4]] 
    [[1 2][4 5][1 3][2 5][2 4][3 5][1 2][3 4][2 3]] 
    [[1 2][4 5][1 4][2 3][1 2][4 5][2 4][3 5][3 4]] 
    [[1 2][4 5][1 4][2 3][2 4][3 5][1 2][3 4][2 3]] 
    [[1 2][4 5][1 4][3 5][1 3][2 4][2 3][4 5][3 4]] 
    [[1 2][4 5][1 4][3 5][2 5][3 4][1 3][2 4][2 3]] 
    [[1 2][4 5][1 5][2 3][2 4][3 5][1 2][3 4][2 3]] 
    [[1 2][4 5][1 5][3 4][1 3][2 4][2 3][4 5][3 4]] 
    [[1 2][4 5][2 4][3 5][1 3][4 5][1 2][3 4][2 3]] 
    [[1 2][4 5][2 5][3 4][1 2][4 5][1 3][2 4][2 3]] 
    [[1 2][4 5][2 5][3 4][1 3][2 4][2 3][4 5][3 4]] 
    [[1 3][2 4][1 2][3 5][1 3][2 4][2 3][4 5][3 4]] 
    [[1 3][2 4][1 2][3 5][2 3][4 5][1 2][3 4][2 3]] 
    [[1 3][2 4][1 2][4 5][1 4][2 3][2 4][3 5][3 4]] 
    [[1 3][2 4][1 2][4 5][2 4][3 5][1 2][3 4][2 3]] 
    [[1 3][2 4][1 4][2 5][1 2][3 5][2 3][4 5][3 4]] 
    [[1 3][2 4][1 4][3 5][2 3][4 5][1 2][3 4][2 3]] 
    [[1 3][2 4][1 5][2 3][1 2][4 5][2 4][3 5][3 4]] 
    [[1 3][2 4][1 5][3 4][1 2][3 5][2 3][4 5][3 4]] 
    [[1 3][2 4][1 5][3 4][2 3][4 5][1 2][3 4][2 3]] 
    [[1 3][2 4][2 3][4 5][1 4][3 5][1 2][3 4][2 3]] 
    [[1 3][2 4][2 5][3 4][1 2][3 5][2 3][4 5][3 4]] 
    [[1 3][2 4][2 5][3 4][1 3][4 5][1 2][3 4][2 3]] 
    [[1 3][2 5][1 2][3 4][1 3][2 5][2 3][4 5][3 4]] 
    [[1 3][2 5][1 2][3 4][2 3][4 5][1 2][3 4][2 3]] 
    [[1 3][2 5][1 2][4 5][1 4][2 3][2 4][3 5][3 4]] 
    [[1 3][2 5][1 2][4 5][2 4][3 5][1 2][3 4][2 3]] 
    [[1 3][2 5][1 4][2 3][1 2][4 5][2 4][3 5][3 4]] 
    [[1 3][2 5][1 4][3 5][1 2][3 4][2 3][4 5][3 4]] 
    [[1 3][2 5][1 4][3 5][2 3][4 5][1 2][3 4][2 3]] 
    [[1 3][2 5][1 5][2 4][1 2][3 4][2 3][4 5][3 4]] 
    [[1 3][2 5][1 5][3 4][2 3][4 5][1 2][3 4][2 3]] 
    [[1 3][2 5][2 3][4 5][1 4][3 5][1 2][3 4][2 3]] 
    [[1 3][2 5][2 4][3 5][1 2][3 4][2 3][4 5][3 4]] 
    [[1 3][2 5][2 4][3 5][1 3][4 5][1 2][3 4][2 3]] 
    [[1 3][4 5][1 2][3 4][1 3][2 5][2 3][4 5][3 4]] 
    [[1 3][4 5][1 2][3 5][1 4][2 3][2 4][3 5][3 4]] 
    [[1 3][4 5][1 2][3 5][2 5][3 4][1 3][2 4][2 3]] 
    [[1 3][4 5][1 4][2 3][1 2][4 5][2 4][3 5][3 4]] 
    [[1 3][4 5][1 4][2 3][2 4][3 5][1 2][3 4][2 3]] 
    [[1 3][4 5][1 4][2 5][1 2][3 4][2 3][4 5][3 4]] 
    [[1 3][4 5][1 4][2 5][2 4][3 5][1 2][3 4][2 3]] 
    [[1 3][4 5][1 5][2 3][2 4][3 5][1 2][3 4][2 3]] 
    [[1 3][4 5][1 5][2 4][1 2][3 4][2 3][4 5][3 4]] 
    [[1 3][4 5][2 4][3 5][1 2][3 4][2 3][4 5][3 4]] 
    [[1 3][4 5][2 4][3 5][1 3][4 5][1 2][3 4][2 3]] 
    [[1 3][4 5][2 5][3 4][1 2][4 5][1 3][2 4][2 3]] 
    [[1 4][2 3][1 2][3 5][1 3][2 4][2 3][4 5][3 4]] 
    [[1 4][2 3][1 2][3 5][2 3][4 5][1 2][3 4][2 3]] 
    [[1 4][2 3][1 2][4 5][1 4][2 3][2 4][3 5][3 4]] 
    [[1 4][2 3][1 2][4 5][2 4][3 5][1 2][3 4][2 3]] 
    [[1 4][2 3][1 3][2 5][1 2][4 5][2 4][3 5][3 4]] 
    [[1 4][2 3][1 3][4 5][2 4][3 5][1 2][3 4][2 3]] 
    [[1 4][2 3][1 5][2 4][1 2][3 5][2 3][4 5][3 4]] 
    [[1 4][2 3][1 5][3 4][1 2][3 5][2 3][4 5][3 4]] 
    [[1 4][2 3][1 5][3 4][2 3][4 5][1 2][3 4][2 3]] 
    [[1 4][2 3][2 4][3 5][1 3][4 5][1 2][3 4][2 3]] 
    [[1 4][2 3][2 5][3 4][1 2][3 5][2 3][4 5][3 4]] 
    [[1 4][2 3][2 5][3 4][1 3][4 5][1 2][3 4][2 3]] 
    [[1 4][2 5][1 2][3 4][1 3][2 5][2 3][4 5][3 4]] 
    [[1 4][2 5][1 2][3 4][2 3][4 5][1 2][3 4][2 3]] 
    [[1 4][2 5][1 2][3 5][1 3][2 4][2 3][4 5][3 4]] 
    [[1 4][2 5][1 2][3 5][2 3][4 5][1 2][3 4][2 3]] 
    [[1 4][2 5][1 3][2 4][1 2][3 5][2 3][4 5][3 4]] 
    [[1 4][2 5][1 3][4 5][1 2][3 4][2 3][4 5][3 4]] 
    [[1 4][2 5][1 3][4 5][2 4][3 5][1 2][3 4][2 3]] 
    [[1 4][2 5][1 5][2 3][1 2][3 4][2 3][4 5][3 4]] 
    [[1 4][2 5][1 5][3 4][2 3][4 5][1 2][3 4][2 3]] 
    [[1 4][2 5][2 3][4 5][1 2][3 4][2 3][4 5][3 4]] 
    [[1 4][2 5][2 3][4 5][1 4][3 5][1 2][3 4][2 3]] 
    [[1 4][2 5][2 4][3 5][1 3][4 5][1 2][3 4][2 3]] 
    [[1 4][3 5][1 2][3 4][1 3][2 5][2 3][4 5][3 4]] 
    [[1 4][3 5][1 2][4 5][1 3][2 4][2 3][4 5][3 4]] 
    [[1 4][3 5][1 2][4 5][2 5][3 4][1 3][2 4][2 3]] 
    [[1 4][3 5][1 3][2 4][1 2][3 5][2 3][4 5][3 4]] 
    [[1 4][3 5][1 3][2 4][2 3][4 5][1 2][3 4][2 3]] 
    [[1 4][3 5][1 3][2 5][1 2][3 4][2 3][4 5][3 4]] 
    [[1 4][3 5][1 3][2 5][2 3][4 5][1 2][3 4][2 3]] 
    [[1 4][3 5][1 5][2 3][1 2][3 4][2 3][4 5][3 4]] 
    [[1 4][3 5][1 5][2 4][2 3][4 5][1 2][3 4][2 3]] 
    [[1 4][3 5][2 3][4 5][1 2][3 4][2 3][4 5][3 4]] 
    [[1 4][3 5][2 3][4 5][1 4][3 5][1 2][3 4][2 3]] 
    [[1 4][3 5][2 5][3 4][1 2][4 5][1 3][2 4][2 3]] 
    [[1 5][2 3][1 2][3 4][1 3][2 5][2 3][4 5][3 4]] 
    [[1 5][2 3][1 2][3 4][2 3][4 5][1 2][3 4][2 3]] 
    [[1 5][2 3][1 2][4 5][1 4][2 3][2 4][3 5][3 4]] 
    [[1 5][2 3][1 2][4 5][2 4][3 5][1 2][3 4][2 3]] 
    [[1 5][2 3][1 3][2 4][1 2][4 5][2 4][3 5][3 4]] 
    [[1 5][2 3][1 3][4 5][2 4][3 5][1 2][3 4][2 3]] 
    [[1 5][2 3][1 4][2 5][1 2][3 4][2 3][4 5][3 4]] 
    [[1 5][2 3][1 4][3 5][1 2][3 4][2 3][4 5][3 4]] 
    [[1 5][2 3][1 4][3 5][2 3][4 5][1 2][3 4][2 3]] 
    [[1 5][2 3][2 4][3 5][1 2][3 4][2 3][4 5][3 4]] 
    [[1 5][2 3][2 4][3 5][1 3][4 5][1 2][3 4][2 3]] 
    [[1 5][2 3][2 5][3 4][1 3][4 5][1 2][3 4][2 3]] 
    [[1 5][2 4][1 2][3 4][1 3][2 5][2 3][4 5][3 4]] 
    [[1 5][2 4][1 2][3 4][2 3][4 5][1 2][3 4][2 3]] 
    [[1 5][2 4][1 2][3 5][1 3][2 4][2 3][4 5][3 4]] 
    [[1 5][2 4][1 2][3 5][2 3][4 5][1 2][3 4][2 3]] 
    [[1 5][2 4][1 3][2 5][1 2][3 4][2 3][4 5][3 4]] 
    [[1 5][2 4][1 3][4 5][1 2][3 4][2 3][4 5][3 4]] 
    [[1 5][2 4][1 3][4 5][2 4][3 5][1 2][3 4][2 3]] 
    [[1 5][2 4][1 4][2 3][1 2][3 5][2 3][4 5][3 4]] 
    [[1 5][2 4][1 4][3 5][2 3][4 5][1 2][3 4][2 3]] 
    [[1 5][2 4][2 3][4 5][1 2][3 4][2 3][4 5][3 4]] 
    [[1 5][2 4][2 3][4 5][1 4][3 5][1 2][3 4][2 3]] 
    [[1 5][2 4][2 5][3 4][1 3][4 5][1 2][3 4][2 3]] 
    [[1 5][3 4][1 2][3 5][1 3][2 4][2 3][4 5][3 4]] 
    [[1 5][3 4][1 2][4 5][1 3][2 4][2 3][4 5][3 4]] 
    [[1 5][3 4][1 2][4 5][2 5][3 4][1 3][2 4][2 3]] 
    [[1 5][3 4][1 3][2 4][1 2][3 5][2 3][4 5][3 4]] 
    [[1 5][3 4][1 3][2 4][2 3][4 5][1 2][3 4][2 3]] 
    [[1 5][3 4][1 3][2 5][1 2][3 4][2 3][4 5][3 4]] 
    [[1 5][3 4][1 3][2 5][2 3][4 5][1 2][3 4][2 3]] 
    [[1 5][3 4][1 4][2 3][1 2][3 5][2 3][4 5][3 4]] 
    [[1 5][3 4][1 4][2 5][2 3][4 5][1 2][3 4][2 3]] 
    [[1 5][3 4][2 3][4 5][1 2][3 4][2 3][4 5][3 4]] 
    [[1 5][3 4][2 3][4 5][1 4][3 5][1 2][3 4][2 3]] 
    [[1 5][3 4][2 4][3 5][1 2][4 5][1 3][2 4][2 3]] 
    [[2 3][4 5][1 2][3 4][1 3][2 5][2 3][4 5][3 4]] 
    [[2 3][4 5][1 2][3 5][1 4][2 3][2 4][3 5][3 4]] 
    [[2 3][4 5][1 2][3 5][2 5][3 4][1 3][2 4][2 3]] 
    [[2 3][4 5][1 3][2 4][1 2][4 5][2 4][3 5][3 4]] 
    [[2 3][4 5][1 3][2 4][1 4][3 5][1 2][3 4][2 3]] 
    [[2 3][4 5][1 3][2 5][1 4][3 5][1 2][3 4][2 3]] 
    [[2 3][4 5][1 4][2 5][1 2][3 4][2 3][4 5][3 4]] 
    [[2 3][4 5][1 4][3 5][1 2][3 4][2 3][4 5][3 4]] 
    [[2 3][4 5][1 4][3 5][2 3][4 5][1 2][3 4][2 3]] 
    [[2 3][4 5][1 5][2 4][1 2][3 4][2 3][4 5][3 4]] 
    [[2 3][4 5][1 5][2 4][1 4][3 5][1 2][3 4][2 3]] 
    [[2 3][4 5][1 5][3 4][1 2][4 5][1 3][2 4][2 3]] 
    [[2 4][3 5][1 2][3 4][1 3][2 5][2 3][4 5][3 4]] 
    [[2 4][3 5][1 2][4 5][1 3][2 4][2 3][4 5][3 4]] 
    [[2 4][3 5][1 2][4 5][2 5][3 4][1 3][2 4][2 3]] 
    [[2 4][3 5][1 3][2 5][1 2][3 4][2 3][4 5][3 4]] 
    [[2 4][3 5][1 3][4 5][1 2][3 4][2 3][4 5][3 4]] 
    [[2 4][3 5][1 3][4 5][2 4][3 5][1 2][3 4][2 3]] 
    [[2 4][3 5][1 4][2 3][1 2][3 5][2 3][4 5][3 4]] 
    [[2 4][3 5][1 4][2 3][1 3][4 5][1 2][3 4][2 3]] 
    [[2 4][3 5][1 4][2 5][1 3][4 5][1 2][3 4][2 3]] 
    [[2 4][3 5][1 5][2 3][1 2][3 4][2 3][4 5][3 4]] 
    [[2 4][3 5][1 5][2 3][1 3][4 5][1 2][3 4][2 3]] 
    [[2 4][3 5][1 5][3 4][1 2][4 5][1 3][2 4][2 3]] 
    [[2 5][3 4][1 2][3 5][1 3][2 4][2 3][4 5][3 4]] 
    [[2 5][3 4][1 2][4 5][1 3][2 4][2 3][4 5][3 4]] 
    [[2 5][3 4][1 2][4 5][2 5][3 4][1 3][2 4][2 3]] 
    [[2 5][3 4][1 3][2 4][1 2][3 5][2 3][4 5][3 4]] 
    [[2 5][3 4][1 3][4 5][1 2][3 4][2 3][4 5][3 4]] 
    [[2 5][3 4][1 3][4 5][2 4][3 5][1 2][3 4][2 3]] 
    [[2 5][3 4][1 4][2 3][1 2][3 5][2 3][4 5][3 4]] 
    [[2 5][3 4][1 4][2 3][1 3][4 5][1 2][3 4][2 3]] 
    [[2 5][3 4][1 4][3 5][1 2][4 5][1 3][2 4][2 3]] 
    [[2 5][3 4][1 5][2 3][1 2][3 4][2 3][4 5][3 4]] 
    [[2 5][3 4][1 5][2 3][1 3][4 5][1 2][3 4][2 3]] 
    [[2 5][3 4][1 5][2 4][1 3][4 5][1 2][3 4][2 3]] 


---------- 


- 6-input: 90 networks 

    [[1 2][3 4][5 6][1 3][2 5][4 6][1 2][3 4][5 6][2 3][4 5][3 4]] 
    [[1 2][3 4][5 6][1 3][2 6][4 5][1 4][2 3][5 6][2 4][3 5][3 4]] 
    [[1 2][3 4][5 6][1 4][2 6][3 5][1 3][2 5][4 6][2 3][4 5][3 4]] 
    [[1 2][3 4][5 6][1 5][2 3][4 6][1 2][3 6][4 5][2 4][3 5][3 4]] 
    [[1 2][3 4][5 6][1 5][2 4][3 6][1 3][2 5][4 6][2 3][4 5][3 4]] 
    [[1 2][3 4][5 6][1 6][2 4][3 5][1 3][2 5][4 6][2 3][4 5][3 4]] 
    [[1 2][3 5][4 6][1 3][2 4][5 6][1 2][3 5][4 6][2 3][4 5][3 4]] 
    [[1 2][3 5][4 6][1 3][2 6][4 5][1 4][2 3][5 6][2 4][3 5][3 4]] 
    [[1 2][3 5][4 6][1 4][2 3][5 6][1 2][3 6][4 5][2 4][3 5][3 4]] 
    [[1 2][3 5][4 6][1 4][2 5][3 6][1 3][2 4][5 6][2 3][4 5][3 4]] 
    [[1 2][3 5][4 6][1 5][2 6][3 4][1 3][2 4][5 6][2 3][4 5][3 4]] 
    [[1 2][3 5][4 6][1 6][2 5][3 4][1 3][2 4][5 6][2 3][4 5][3 4]] 
    [[1 2][3 6][4 5][1 3][2 4][5 6][1 2][3 5][4 6][2 3][4 5][3 4]] 
    [[1 2][3 6][4 5][1 3][2 5][4 6][1 4][2 3][5 6][2 4][3 5][3 4]] 
    [[1 2][3 6][4 5][1 4][2 3][5 6][1 2][3 6][4 5][2 4][3 5][3 4]] 
    [[1 2][3 6][4 5][1 4][2 6][3 5][1 3][2 4][5 6][2 3][4 5][3 4]] 
    [[1 2][3 6][4 5][1 5][2 6][3 4][1 3][2 4][5 6][2 3][4 5][3 4]] 
    [[1 2][3 6][4 5][1 6][2 5][3 4][1 3][2 4][5 6][2 3][4 5][3 4]] 
    [[1 3][2 4][5 6][1 2][3 5][4 6][1 3][2 4][5 6][2 3][4 5][3 4]] 
    [[1 3][2 4][5 6][1 2][3 6][4 5][1 4][2 3][5 6][2 4][3 5][3 4]] 
    [[1 3][2 4][5 6][1 4][2 5][3 6][1 2][3 5][4 6][2 3][4 5][3 4]] 
    [[1 3][2 4][5 6][1 5][2 3][4 6][1 2][3 6][4 5][2 4][3 5][3 4]] 
    [[1 3][2 4][5 6][1 5][2 6][3 4][1 2][3 5][4 6][2 3][4 5][3 4]] 
    [[1 3][2 4][5 6][1 6][2 5][3 4][1 2][3 5][4 6][2 3][4 5][3 4]] 
    [[1 3][2 5][4 6][1 2][3 4][5 6][1 3][2 5][4 6][2 3][4 5][3 4]] 
    [[1 3][2 5][4 6][1 2][3 6][4 5][1 4][2 3][5 6][2 4][3 5][3 4]] 
    [[1 3][2 5][4 6][1 4][2 3][5 6][1 2][3 6][4 5][2 4][3 5][3 4]] 
    [[1 3][2 5][4 6][1 4][2 6][3 5][1 2][3 4][5 6][2 3][4 5][3 4]] 
    [[1 3][2 5][4 6][1 5][2 4][3 6][1 2][3 4][5 6][2 3][4 5][3 4]] 
    [[1 3][2 5][4 6][1 6][2 4][3 5][1 2][3 4][5 6][2 3][4 5][3 4]] 
    [[1 3][2 6][4 5][1 2][3 4][5 6][1 3][2 5][4 6][2 3][4 5][3 4]] 
    [[1 3][2 6][4 5][1 2][3 5][4 6][1 4][2 3][5 6][2 4][3 5][3 4]] 
    [[1 3][2 6][4 5][1 4][2 3][5 6][1 2][3 6][4 5][2 4][3 5][3 4]] 
    [[1 3][2 6][4 5][1 4][2 5][3 6][1 2][3 4][5 6][2 3][4 5][3 4]] 
    [[1 3][2 6][4 5][1 5][2 4][3 6][1 2][3 4][5 6][2 3][4 5][3 4]] 
    [[1 3][2 6][4 5][1 6][2 4][3 5][1 2][3 4][5 6][2 3][4 5][3 4]] 
    [[1 4][2 3][5 6][1 2][3 5][4 6][1 3][2 4][5 6][2 3][4 5][3 4]] 
    [[1 4][2 3][5 6][1 2][3 6][4 5][1 4][2 3][5 6][2 4][3 5][3 4]] 
    [[1 4][2 3][5 6][1 3][2 5][4 6][1 2][3 6][4 5][2 4][3 5][3 4]] 
    [[1 4][2 3][5 6][1 5][2 4][3 6][1 2][3 5][4 6][2 3][4 5][3 4]] 
    [[1 4][2 3][5 6][1 5][2 6][3 4][1 2][3 5][4 6][2 3][4 5][3 4]] 
    [[1 4][2 3][5 6][1 6][2 5][3 4][1 2][3 5][4 6][2 3][4 5][3 4]] 
    [[1 4][2 5][3 6][1 2][3 4][5 6][1 3][2 5][4 6][2 3][4 5][3 4]] 
    [[1 4][2 5][3 6][1 2][3 5][4 6][1 3][2 4][5 6][2 3][4 5][3 4]] 
    [[1 4][2 5][3 6][1 3][2 4][5 6][1 2][3 5][4 6][2 3][4 5][3 4]] 
    [[1 4][2 5][3 6][1 3][2 6][4 5][1 2][3 4][5 6][2 3][4 5][3 4]] 
    [[1 4][2 5][3 6][1 5][2 3][4 6][1 2][3 4][5 6][2 3][4 5][3 4]] 
    [[1 4][2 5][3 6][1 6][2 3][4 5][1 2][3 4][5 6][2 3][4 5][3 4]] 
    [[1 4][2 6][3 5][1 2][3 4][5 6][1 3][2 5][4 6][2 3][4 5][3 4]] 
    [[1 4][2 6][3 5][1 2][3 6][4 5][1 3][2 4][5 6][2 3][4 5][3 4]] 
    [[1 4][2 6][3 5][1 3][2 4][5 6][1 2][3 5][4 6][2 3][4 5][3 4]] 
    [[1 4][2 6][3 5][1 3][2 5][4 6][1 2][3 4][5 6][2 3][4 5][3 4]] 
    [[1 4][2 6][3 5][1 5][2 3][4 6][1 2][3 4][5 6][2 3][4 5][3 4]] 
    [[1 4][2 6][3 5][1 6][2 3][4 5][1 2][3 4][5 6][2 3][4 5][3 4]] 
    [[1 5][2 3][4 6][1 2][3 4][5 6][1 3][2 5][4 6][2 3][4 5][3 4]] 
    [[1 5][2 3][4 6][1 2][3 6][4 5][1 4][2 3][5 6][2 4][3 5][3 4]] 
    [[1 5][2 3][4 6][1 3][2 4][5 6][1 2][3 6][4 5][2 4][3 5][3 4]] 
    [[1 5][2 3][4 6][1 4][2 5][3 6][1 2][3 4][5 6][2 3][4 5][3 4]] 
    [[1 5][2 3][4 6][1 4][2 6][3 5][1 2][3 4][5 6][2 3][4 5][3 4]] 
    [[1 5][2 3][4 6][1 6][2 4][3 5][1 2][3 4][5 6][2 3][4 5][3 4]] 
    [[1 5][2 4][3 6][1 2][3 4][5 6][1 3][2 5][4 6][2 3][4 5][3 4]] 
    [[1 5][2 4][3 6][1 2][3 5][4 6][1 3][2 4][5 6][2 3][4 5][3 4]] 
    [[1 5][2 4][3 6][1 3][2 5][4 6][1 2][3 4][5 6][2 3][4 5][3 4]] 
    [[1 5][2 4][3 6][1 3][2 6][4 5][1 2][3 4][5 6][2 3][4 5][3 4]] 
    [[1 5][2 4][3 6][1 4][2 3][5 6][1 2][3 5][4 6][2 3][4 5][3 4]] 
    [[1 5][2 4][3 6][1 6][2 3][4 5][1 2][3 4][5 6][2 3][4 5][3 4]] 
    [[1 5][2 6][3 4][1 2][3 5][4 6][1 3][2 4][5 6][2 3][4 5][3 4]] 
    [[1 5][2 6][3 4][1 2][3 6][4 5][1 3][2 4][5 6][2 3][4 5][3 4]] 
    [[1 5][2 6][3 4][1 3][2 4][5 6][1 2][3 5][4 6][2 3][4 5][3 4]] 
    [[1 5][2 6][3 4][1 3][2 5][4 6][1 2][3 4][5 6][2 3][4 5][3 4]] 
    [[1 5][2 6][3 4][1 4][2 3][5 6][1 2][3 5][4 6][2 3][4 5][3 4]] 
    [[1 5][2 6][3 4][1 6][2 3][4 5][1 2][3 4][5 6][2 3][4 5][3 4]] 
    [[1 6][2 3][4 5][1 2][3 4][5 6][1 3][2 5][4 6][2 3][4 5][3 4]] 
    [[1 6][2 3][4 5][1 2][3 5][4 6][1 4][2 3][5 6][2 4][3 5][3 4]] 
    [[1 6][2 3][4 5][1 3][2 4][5 6][1 2][3 6][4 5][2 4][3 5][3 4]] 
    [[1 6][2 3][4 5][1 4][2 5][3 6][1 2][3 4][5 6][2 3][4 5][3 4]] 
    [[1 6][2 3][4 5][1 4][2 6][3 5][1 2][3 4][5 6][2 3][4 5][3 4]] 
    [[1 6][2 3][4 5][1 5][2 4][3 6][1 2][3 4][5 6][2 3][4 5][3 4]] 
    [[1 6][2 4][3 5][1 2][3 4][5 6][1 3][2 5][4 6][2 3][4 5][3 4]] 
    [[1 6][2 4][3 5][1 2][3 6][4 5][1 3][2 4][5 6][2 3][4 5][3 4]] 
    [[1 6][2 4][3 5][1 3][2 5][4 6][1 2][3 4][5 6][2 3][4 5][3 4]] 
    [[1 6][2 4][3 5][1 3][2 6][4 5][1 2][3 4][5 6][2 3][4 5][3 4]] 
    [[1 6][2 4][3 5][1 4][2 3][5 6][1 2][3 5][4 6][2 3][4 5][3 4]] 
    [[1 6][2 4][3 5][1 5][2 3][4 6][1 2][3 4][5 6][2 3][4 5][3 4]] 
    [[1 6][2 5][3 4][1 2][3 5][4 6][1 3][2 4][5 6][2 3][4 5][3 4]] 
    [[1 6][2 5][3 4][1 2][3 6][4 5][1 3][2 4][5 6][2 3][4 5][3 4]] 
    [[1 6][2 5][3 4][1 3][2 4][5 6][1 2][3 5][4 6][2 3][4 5][3 4]] 
    [[1 6][2 5][3 4][1 3][2 6][4 5][1 2][3 4][5 6][2 3][4 5][3 4]] 
    [[1 6][2 5][3 4][1 4][2 3][5 6][1 2][3 5][4 6][2 3][4 5][3 4]] 
    [[1 6][2 5][3 4][1 5][2 3][4 6][1 2][3 4][5 6][2 3][4 5][3 4]] 

Personalmente me gustaría comprobar que la red de ordenación es correcta antes de usar en lugar de tomar la palabra de alguna página al azar en Internet. La fuerza bruta "solo" requiere ejecutarla contra un número finito de entradas: "obviamente" n! entradas es suficiente, y de hecho también lo es 2**n (https://en.wikipedia.org/wiki/Sorting_network#Zero-one_principle).

Todas las 5 redes óptimas implican "3" en el último intercambio, por lo que elegir la mediana en menos intercambios no es tan fácil como todo eso. Sin embargo, se puede hacer en 6 comparaciones. No hay manera más código que necesita aquí, si se puede ignorar el quejarse de la pregunta:

Code to calculate "median of five" in C#

para elegir un medio que no necesariamente hace cualquier permutas, que no sea quizás uno de intercambio incondicional si quieres conservar los 5 valores Un movimiento podría ser adecuado.

+0

¡Gracias por el enlace! No sé si SO necesita copiar y pegar, pero sería bueno mejorar el pagerank de esa referencia, ya que no apareció en mi búsqueda en Google estándar. :-( –

+1

Sí, SO necesita copiar y pegar. –

+1

@Amigable Clark Kant: +100 a su comentario si pudiera darlo. Pruebe el enlace ahora ... ¿Alguien tiene una copia en caché para pegar aquí? –

1

El solicitante estaba específicamente interesado en una implementación de la mediana de 5 basada en redes de clasificación, por lo que abordaré este caso específico. Una breve revisión de la literatura indica cuáles son las soluciones óptimas de acuerdo con varias métricas.

Michael Codish, Luís Cruz-Filipe, Thorsten Ehlers, Mike Müller y Peter Schneider-Kamp. "Ordenando redes: hasta el final y viceversa". Journal of Computer and System Sciences (2016) en la tabla 1 muestra que para n = 5, el número mínimo de compare-swaps es 9, y la profundidad mínima de la red es 5. Como cada comparación-swap es equivalente para dos operaciones mín./máx., , la cantidad mínima de operaciones mínima/máxima requerida es 18.

Lukáŝ Sekanina, "Exploración espacial de diseño evolutivo para circuitos medianos". En:. EvoWorkshops, marzo de 2004, pp 240-249, da el número mínimo de operaciones mín/máx necesarios para una óptima red de selección de mediana de cinco entradas como 10 en la tabla 1.

William Gasarch, Wayne Kelly y William Pugh. "Encontrar el i-ésimo mayor de n para pequeño i, n." ACM SIGACT News 27, no. 2 (1996): 88-96, tabla 1: se necesitan al menos 6 comparaciones para la mediana de 5.

En general, la clasificación de redes con el número mínimo de operaciones es no se reduce a redes de selección mediana con el número mínimo de operaciones simplemente mediante la eliminación de operaciones redundantes. Pero es posible encontrar redes que se reducen de manera óptima por al menos algunos valores de n. Para n = 5, es factible una búsqueda de fuerza bruta para tales redes.

El siguiente código muestra cuatro variantes de redes de clasificación de cinco entradas que comprenden 9 operaciones de cambio de comparación u, alternativamente, 18 operaciones de mín/máx. Cuando se compila con FULL_SORT = 0, estos se convierten en redes de selección mediana con operaciones de 10 min/max. De acuerdo con esta métrica, tanto la clasificación como la selección de la mediana son óptimas.

Pero, cuando se utiliza como una red de clasificación, las cuatro variantes tienen una profundidad de seis en lugar de un mínimo de cinco. Además, cuando se configura como una red de selección de medios basada en comparaciones en lugar de operaciones mín/máx, todas requieren siete en lugar de seis comparaciones como mínimo.

Ejemplo de resultados de compilación del compilador Explorer (godbolt): usando operaciones de 18 min/max para cinco entradas sort, usando operaciones de 10 min/max para cinco entradas median.

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

#define VARIANT  1 
#define USE_MIN_MAX 1 
#define FULL_SORT  0 

typedef float T; 

#if USE_MIN_MAX 
#define MIN(a,b) ((T)(fmin(a,b))) 
#define MAX(a,b) ((T)(fmax(a,b))) 
#define SWAP(i,j) do { T s = MIN(a##i,a##j); T t = MAX(a##i,a##j); a##i = s; a##j = t; } while (0) 
#else // USE_MIN_MAX 
#define MIN(a,b) (((a) > (b)) ? (b) : (a)) 
#define MAX(a,b) (((a) > (b)) ? (a) : (b)) 
#define SWAP(i,j) do { if (a##i > a##j) { T temp = a##i; a##i = a##j; a##j = temp; }} while (0) 
#endif // USE_MIN_MAX 

/* Use sorting/median network to fully or partially sort array of five values 
    and return the median value 
*/ 
T network5 (T *a) 
{ 
    // copy to scalars 
    T a0, a1, a2, a3, a4; 
    a0=a[0];a1=a[1];a2=a[2];a3=a[3];a4=a[4]; 

#if VARIANT == 1 
    SWAP (1, 2); SWAP (4, 3); 
    SWAP (2, 3); 
    SWAP (0, 2); SWAP (1, 4); 
    SWAP (2, 4); 
    SWAP (3, 4); SWAP (0, 2); 
    SWAP (0, 1); 
#elif VARIANT == 2 
    SWAP (3, 4); SWAP (0, 2); 
    SWAP (2, 4); SWAP (0, 3); 
    SWAP (2, 3); 
    SWAP (1, 2); 
    SWAP (0, 1); SWAP (2, 3); 
    SWAP (3, 4); 
#elif VARIANT == 3 
    SWAP (3, 2); SWAP (0, 4); 
    SWAP (2, 4); SWAP (0, 3); 
    SWAP (2, 3); 
    SWAP (1, 2); 
    SWAP (0, 1); SWAP (2, 3); 
    SWAP (3, 4); 
#elif VARIANT == 4 
    SWAP (2, 4); SWAP (0, 1); 
    SWAP (0, 2); SWAP (1, 4); 
    SWAP (2, 3); 
    SWAP (1, 2); 
    SWAP (2, 3); SWAP (0, 1); 
    SWAP (3, 4); 
#else 
#error unsupported VARIANT 
#endif 

#if FULL_SORT 
    // copy back sorted results 
    a[0]=a0;a[1]=a1;a[2]=a2;a[3]=a3;a[4]=a4; 
#endif 
    // return median-of-5 
    return a2; 
} 
Cuestiones relacionadas