O algoritmo de classificação é assim:
Enquanto a lista não estiver classificada, encaixe metade de todos os itens (remova-os da lista). Continue até que a lista seja classificada ou apenas um item permaneça (que é classificado por padrão). Esse algoritmo de classificação pode fornecer resultados diferentes com base na implementação.
O procedimento de remoção do item depende da implementação, mas a lista deve ter a metade do tempo anterior a uma passagem do procedimento de remoção do item. Seu algoritmo pode decidir remover a primeira metade ou a lista, a última metade da lista, todos os itens ímpares, todos os itens pares, um de cada vez até que a lista tenha a metade do comprimento ou qualquer outro não mencionado.
A lista de entrada pode conter uma quantidade arbitrária de itens (dentro da razão, digamos, até 1000 itens), não apenas listas perfeitamente divisíveis de 2 ^ n itens. Você precisará remover (n + 1) / 2 ou (n-1) / 2 itens se a lista for ímpar, codificada permanentemente ou decidida aleatoriamente durante o tempo de execução. Decida por si mesmo: o que Thanos faria se o universo contivesse uma quantidade ímpar de seres vivos?
A lista é classificada se nenhum item for menor que qualquer item anterior. Podem ocorrer duplicatas na entrada e na saída.
Seu programa deve receber uma matriz de números inteiros (via stdin ou como parâmetros, itens individuais ou um parâmetro de matriz) e retornar a matriz classificada (ou imprimi-la em stdout).
Exemplos:
// 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]
poderia dar resultados diferentes:
// Removing every second item:
[1, 2, 4, 3, 5] -> [1, 4, 5]
ou:
// 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
ou:
// 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
ou:
// 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]
. Meu próprio algoritmo falhou nesta entrada