Esta é uma questão de código-golfe.
Entrada
Uma lista de números inteiros não negativos em qualquer formato que seja mais conveniente.
Resultado
A mesma lista em ordem classificada, em qualquer formato que seja mais conveniente.
Restrição
- Seu código deve ser executado no tempo O (n log n) no pior caso, onde
n
está o número de números inteiros na entrada. Isso significa que o quicksort aleatório está fora, por exemplo. No entanto, existem muitas outras opções para você escolher. - Não use nenhuma biblioteca / função / similar de classificação. Além disso, não use nada que faça a maior parte da classificação funcionar como uma biblioteca de heap. Basicamente, o que você implementar, implemente a partir do zero.
Você pode definir uma função, se quiser, mas então mostre um exemplo dela em um programa completo realmente funcionando. Ele deve ser executado com sucesso e rapidez em todos os casos de teste abaixo.
Casos de teste
In: [9, 8, 3, 2, 4, 6, 5, 1, 7, 0]
Out:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
In: [72, 59, 95, 68, 84]
Out:[59, 68, 72, 84, 95]
In: [2, 2, 1, 9, 3, 7, 4, 1, 6, 7]
Out:[1, 1, 2, 2, 3, 4, 6, 7, 7, 9]
In: [2397725, 1925225, 3304534, 7806949, 4487711, 8337622, 2276714, 3088926, 4274324, 667269]
Out:[667269,1925225, 2276714, 2397725,3088926, 3304534, 4274324, 4487711, 7806949, 8337622]
Suas respostas
Indique o algoritmo de classificação que você implementou e o tamanho da sua solução no título da sua resposta.
Algoritmos de classificação de tempo O (n log n)
Existem muitos algoritmos de tempo O (n log n) existentes. Esta tabela possui uma lista de alguns deles.
intersect
classificar automaticamente a matriz. Eu acho que você quer excluir isso também. Que talunique
(remover duplicatas, classificar o resultado)?intersect
vem em "semelhante" se ele classifica automaticamente a matriz. Se você remover duplicatas, você fornecerá a saída errada.Respostas:
Haskell,
878089Essa é a classificação por mesclagem, implementada de baixo para cima. primeiro, empacotamos todos os elementos em sua própria lista e depois os mesclamos dois a dois, e novamente os mesclamos dois a dois, até ficarmos com uma lista.
(%)
é a função de mesclagemj
mescla pares em uma lista de listasr
mescla uma lista completa de listass
é a função de classificação.Uso: Execute um intérprete e insira
s [3,5,2,6,7]
.Edit: a maneira como eu estava fundindo as coisas antes não era a ordem certa, então para corrigi-lo eu precisava de mais 9 caracteres.
fonte
main = print (s [5,3,6,8])
que definirá como principal a impressão do resultado da classificação.[]%s=s
, porque se o primeiro elemento é[]
, a(x:a)
correspondência falha e o último caso vira os elementos, para que sejas%[]
bem-sucedido.JavaScript (ES6),
195193191189188186183182 182179174172 bytesEsta é uma implementação de heapsort. Espero que alguém crie um mergesort mais curto, mas eu gosto deste: P
Atualização: R fusesort batido. Ruby a seguir: D
Teste (Firefox)
Mostrar snippet de código
fonte
Python3, 132 bytes
Mergesort simples. Muitos bytes foram gastos para garantir que isso realmente seja executado em O (n log n), se apenas o algoritmo , mas não a implementação, precisar ser O (n log n), isso pode ser reduzido:
Python3, 99 bytes
Isso não é O (n log n) porque
.pop(0)
é O (n), tornando a função de mesclagem O (n ^ 2). Mas isso é bastante artificial, como.pop(0)
poderia facilmente ter sido O (1).fonte
Julia, 166 bytes
A função principal é chamada
M
e chama uma função auxiliarm
. Ele usa a classificação de mesclagem , que tem O ( n log n ) como sua complexidade de pior caso.Exemplo de uso:
Ungolfed:
fonte
R, 181 bytes, Mergesort
Recuado, com novas linhas:
Casos de teste:
fonte
Scala, função de 243 bytes (aplicativo independente de 315 bytes), Mergesort
Esta resposta pretende ser uma função, mas pode ser expandida para ser um aplicativo independente.
Somente função (243 bytes):
Aplicativo independente (315 bytes):
Uso:
Exemplo de entrada:
Resultado:
Restrições e considerações:
Atribuição:
m()
função) inspirada nesta resposta: /codereview//a/21590/28856fonte
Geléia, 29 bytes, classificação por mesclagem
Como a resposta Python do orlp, isso é usado
list.pop(0)
sob o capô, o que éO(n)
, mas a implementação é formalO(n log n)
.Experimente aqui.
Explicação
fonte
.pop(0)
é O (n), fazendo com que a função de mesclagem O (n ^ 2). Mas isso é bastante artificial, como.pop(0)
poderia facilmente ter sido O (1).Ḣ
é implementado como.pop(0)
.Ruby, 167 bytes
Algoritmo de classificação de mesclagem com golfe, que possui o pior caso O (n log n)
Teste aqui!
Para testar, copie e cole o código na janela e adicione
puts f[x]
na parte inferior, onde x é uma matriz com a entrada. (Certifique-se de selecionar Ruby como idioma, é claro). Por exemplo,puts f[[2, 2, 1, 9, 3, 7, 4, 1, 6, 7]]
fonte
Ruby, 297 bytes
Mesclar classificação. Programa completo, em vez de uma função. Requer dois argumentos em tempo de execução: arquivo de entrada e arquivo de saída, cada um com um elemento por linha.
fonte
$stdin.readlines
já é menos bytes queopen(ARGV[0]).readlines
, mesmo computs
mais deopen(ARGV[1],"w"){|f|f.puts
if $0==__FILE__
são realmente desnecessárias em um código de golfe. Você também pode solicitar a substituição de cada;
uma por uma nova linha - é a mesma contagem de bytes e (provavelmente) remove a rolagem horizontal do código. Além disso, vou recomendar dicas de golfe no Ruby .