El algoritmo de clasificación es el siguiente:
Mientras la lista no esté ordenada, ajuste la mitad de todos los elementos (elimínelos de la lista). Continúe hasta que la lista esté ordenada o solo quede un elemento (que está ordenado de manera predeterminada). Este algoritmo de clasificación puede dar resultados diferentes según la implementación.
El procedimiento de eliminación de elementos depende de la implementación que decida, pero la lista debe ser la mitad del tiempo anterior a una pasada del procedimiento de eliminación de elementos. Su algoritmo puede decidir eliminar ya sea la primera mitad o la lista, la última mitad de la lista, todos los elementos impares, todos los elementos pares, uno a la vez hasta que la lista sea la mitad de la lista, o ninguno no mencionado.
La lista de entrada puede contener una cantidad arbitraria de elementos (dentro de lo razonable, digamos hasta 1000 elementos), no solo listas perfectamente divisibles de 2 ^ n elementos. Tendrá que eliminar (n + 1) / 2 o (n-1) / 2 elementos si la lista es impar, ya sea codificada o decidida aleatoriamente durante el tiempo de ejecución. Decide por ti mismo: ¿qué haría Thanos si el universo contuviera una cantidad extraña de seres vivos?
La lista se ordena si ningún elemento es más pequeño que cualquier elemento anterior. Se pueden producir duplicados en la entrada y en la salida.
Su programa debe tomar una matriz de enteros (a través de stdin o como parámetros, ya sea elementos individuales o un parámetro de matriz), y devolver la matriz ordenada (o imprimirla en stdout).
Ejemplos:
// A sorted list remains sorted
[1, 2, 3, 4, 5] -> [1, 2, 3, 4, 5]
// A list with duplicates may keep duplicates in the result
[1, 2, 3, 4, 3] -> [1, 3, 3] // Removing every second item
[1, 2, 3, 4, 3] -> [3, 4, 3] -> [4, 3] -> [3] // Removing the first half
[1, 2, 3, 4, 3] -> [1, 2] // Removing the last half
[1, 2, 4, 3, 5]
podría dar resultados diferentes:
// Removing every second item:
[1, 2, 4, 3, 5] -> [1, 4, 5]
o:
// Removing the first half of the list
[1, 2, 4, 3, 5] -> [3, 5] // With (n+1)/2 items removed
[1, 2, 4, 3, 5] -> [4, 3, 5] -> [3, 5] // With (n-1)/2 items removed
o:
// Removing the last half of the list
[1, 2, 4, 3, 5] -> [1, 2] // With (n+1)/2 items removed
[1, 2, 4, 3, 5] -> [1, 2, 4] // With (n-1)/2 items removed
o:
// Taking random items away until half (in this case (n-1)/2) of the items remain
[1, 2, 4, 3, 5] -> [1, 4, 3] -> [4, 3] -> [4]
[9, 1, 1, 1, 1]
. Mi propio algoritmo falló en esta entrada