Crie uma função ou programa que aceite duas entradas:
- Uma lista de números inteiros que devem ser classificados (menos de 20 elementos)
- Um número inteiro positivo
N
, dizendo quantas comparações você deve fazer
A função deve parar e gerar a lista resultante de números inteiros após N
comparações. Se a lista estiver totalmente classificada antes das N
comparações serem feitas, a lista classificada deverá ser gerada.
O algoritmo de classificação de bolhas é bem conhecido, e acho que a maioria das pessoas sabe disso. O seguinte pseudo-código e animação (ambos do artigo vinculado da Wikipedia) devem fornecer os detalhes necessários:
procedure bubbleSort( A : list of sortable items )
n = length(A)
repeat
swapped = false
for i = 1 to n-1 inclusive do
/* if this pair is out of order */
if A[i-1] > A[i] then
/* swap them and remember something changed */
swap( A[i-1], A[i] )
swapped = true
end if
end for
until not swapped
end procedure
A animação abaixo mostra o progresso:
Um exemplo (extraído diretamente do artigo vinculado da Wikipedia) mostra as etapas ao classificar a lista ( 5 1 4 2 8 )
:
Primeira passagem
1: ( 5 1 4 2 8 ) -> ( 1 5 4 2 8 ) // Here, algorithm compares the first two elements,
// and swaps since 5 > 1.
2: ( 1 5 4 2 8 ) -> ( 1 4 5 2 8 ) // Swap since 5 > 4
3: ( 1 4 5 2 8 ) -> ( 1 4 2 5 8 ) // Swap since 5 > 2
4: ( 1 4 2 5 8 ) -> ( 1 4 2 5 8 ) // Now, since these elements are already in order
// (8 > 5), algorithm does not swap them.
Segunda passagem
5: ( 1 4 2 5 8 ) -> ( 1 4 2 5 8 )
6: ( 1 4 2 5 8 ) -> ( 1 2 4 5 8 ) // Swap since 4 > 2
7: ( 1 2 4 5 8 ) -> ( 1 2 4 5 8 )
8: ( 1 2 4 5 8 ) -> ( 1 2 4 5 8 )
Agora, a matriz já está classificada, mas o algoritmo não sabe se foi concluído. O algoritmo precisa de uma passagem inteira sem qualquer troca para saber que está classificado.
Terceiro Passe
9: ( 1 2 4 5 8 ) -> ( 1 2 4 5 8 )
10:( 1 2 4 5 8 ) -> ( 1 2 4 5 8 )
11:( 1 2 4 5 8 ) -> ( 1 2 4 5 8 )
12:( 1 2 4 5 8 ) -> ( 1 2 4 5 8 )
Casos de teste:
Formato: Number of comparisons (N): List after N comparisons
Input list:
5 1 4 2 8
Test cases:
1: 1 5 4 2 8
2: 1 4 5 2 8
3: 1 4 2 5 8
4: 1 4 2 5 8
5: 1 4 2 5 8
6: 1 2 4 5 8
10: 1 2 4 5 8
14: 1 2 4 5 8
Input list:
0: 15 18 -6 18 9 -7 -1 7 19 19 -5 20 19 5 15 -5 3 18 14 19
Test cases:
1: 15 18 -6 18 9 -7 -1 7 19 19 -5 20 19 5 15 -5 3 18 14 19
21: -6 15 18 9 -7 -1 7 18 19 -5 19 19 5 15 -5 3 18 14 19 20
41: -6 9 -7 15 -1 7 18 18 -5 19 19 5 15 -5 3 18 14 19 19 20
60: -6 -7 -1 9 7 15 18 -5 18 19 5 15 -5 3 18 14 19 19 19 20
61: -6 -7 -1 7 9 15 18 -5 18 19 5 15 -5 3 18 14 19 19 19 20
81: -7 -6 -1 7 9 15 -5 18 18 5 15 -5 3 18 14 19 19 19 19 20
119: -7 -6 -1 -5 7 9 15 5 15 -5 3 18 14 18 18 19 19 19 19 20
120: -7 -6 -1 -5 7 9 15 5 15 -5 3 18 14 18 18 19 19 19 19 20
121: -7 -6 -1 -5 7 9 5 15 15 -5 3 18 14 18 18 19 19 19 19 20
122: -7 -6 -1 -5 7 9 5 15 15 -5 3 18 14 18 18 19 19 19 19 20
123: -7 -6 -1 -5 7 9 5 15 -5 15 3 18 14 18 18 19 19 19 19 20
201: -7 -6 -5 -1 -5 3 5 7 9 14 15 15 18 18 18 19 19 19 19 20
221: -7 -6 -5 -5 -1 3 5 7 9 14 15 15 18 18 18 19 19 19 19 20
- Sim, são permitidos algoritmos de classificação de bolha incorporados.
- Não, você não pode assumir apenas números inteiros positivos ou números únicos.
- A classificação deve estar na ordem descrita acima. Você não pode começar no final da lista
Respostas:
Gelatina , 25 bytes
Com base na minha resposta em J.
Experimente online!
Verifique o número de comparações.
Explicação
O link auxiliar modifica a lista no índice
[i-1, i]
, classificando-o que produz o mesmo resultado que a comparação de classificação de bolhas.fonte
JavaScript (ES6),
10282808680 bytesCorreção de bugs e 1 byte salvo graças a @ edc65
A recursão
pode não ser,definitivamente nãoé, provavelmente é a melhor abordagem, mas estou usando um loop por enquanto.Experimente:
Mostrar snippet de código
fonte
f=(a,m,n=0,_,b=a[n+1])=>b+.5?m?f(a,m-1,n+1,a[n]>b?a[a[n+1]=a[n],n]=b:0):a:f(a,m,0)
.,0
1/b
vez deb+.5
procurar porundefined
Haskell,
838281 bytesExemplo de uso:
[5,1,4,2,8] ! 5
->[1,4,2,5,8]
.Em função,
%
y
mantém o controle dos elementos visitados até o momento durante o passe atual,x
ainda não foram examinados.a
eb
são os próximos dois, ou seja, os candidatos a trocar. Se chegarmos ao fim da lista, vamos começar desde o início:y%x = []%(y++x)
. Todas as etapas são armazenadas em uma lista onde a função principal seleciona on
elemento th.Editar: as versões anteriores não funcionavam para listas de elemento único, felizmente a nova versão é ainda mais curta.
fonte
f=
antes da segunda linha da resposta e anexe uma terceira linha ao programa que contémmain=print(f [5,1,4,2,8] 5)
. Isso deve torná-lo executável.Python 3,
7774 bytes-3 bytes graças a @Maltysen (init
j
na declaração)Casos de teste em ideone
Usa
sorted
para fazer cada operação de comparação e troca, mas está executando uma classificação de bolha.Define
j=0
(o índice esquerdo) e executan
comparações e trocas de itens de lista adjacentes, redefinindoj
para0
sempre que essa janela sair dos limites.O
j*=j<len(l)-1
multiplicaráj
porFalse
(ie0
) nesse ponto, enquanto que em todas as outras vezes multiplicaráj
porTrue
(ie1
).(Ele também funcionará para uma lista vazia também.)
fonte
j
, você pode usar%
eval
no MATLAB devido às atribuições inline.PowerShell v2 +,
135129 bytesEntão. Muitos. Dólares.
( Salvo seis bytes por perceber que este desafio não inclui o "de graça" otimização de pular o último elemento (s) em cada passagem, uma vez que está garantido classificadas e, em vez atravessa uma passagem completa de cada vez. Isso mudou a
$a.count
nafor
loop e eliminou a$z
variável. )Tipo de bolha reta, com um ponto bacana, fazendo a troca em uma única etapa -
$a[$_],$a[$_+1]=$a[$_+1],$a[$_]
A lógica de saída é tratada através de
if(!--$n){$a;exit}
Casos de teste
(A matriz é mostrada como separada por espaço aqui, porque o separador de campo de saída padrão para stringing de uma matriz é um espaço. A stringification ocorre porque estamos concatenando com os rótulos
"$_ -> "
.)fonte
R,
132131112136 bytesO programa recebe a entrada da seguinte maneira: primeiro
N
, depois o próprio vetor. Por exemplo, se você quiserv = [5 1 4 2 8]
en = 1
, a entrada que entra no arquivoscan
é1 5 1 4 2 8
. Portanto, para executar este programa, você executa a primeira linha , alimenta os números um a um no console e, em seguida, executa o restante (esta é uma resposta REPL).Em seguida, o código a seguir faz o truque:
Teste:
Atualização: 1 byte de golfe devido a Vlo .
fonte
Pyth,
3432 BytesUma tradução da resposta Python de Jonathan Allan.
Experimente aqui!
fonte
JavaScript (ES6),
828079 bytesCom base na resposta original da @ ETHproduction. Editar: salvou 2 bytes graças a @JonathanAllan. Guardou 1 byte graças a @ edc65.
fonte
J ,
6260 bytesEste é um verbo que recebe dois argumentos: o número de comparações no LHS e a lista de números inteiros no RHS. Primeiro, ele verifica se o comprimento da lista é maior que um. Caso contrário, ele retorna a lista sem modificação, caso contrário, opera com ela executando o número especificado de comparações antes de retornar o resultado.
Uso
Para o primeiro caso de teste, comandos extras são usados para formatar várias entradas / saídas. O segundo caso de teste é mostrado como entrada / saída única.
Explicação
É difícil escrever código conciso em J que usa mutabilidade, então, em vez disso, converto o problema em reduzir uma lista em um conjunto de indicações. Eu acho que esse código é confuso, então eu passo a passo o trabalho de cada frase em vez de cada primitivo. A primeira parte pega o comprimento da lista e produz um intervalo. Em seguida, opere em cada infixo do tamanho 2 para emular uma passagem de comparações.
Estas são as indicações iniciais de cada comparação. Se 7 comparações estiverem sendo realizadas, reformule-a para obter a quantidade desejada. J analisa da direita para a esquerda, diminuindo da direita para a esquerda, como dobra-direita. Anexe a lista inicial e inverta-a.
Como alternativa, o intervalo [0, 7) pode ser definido e cada valor obtido modula o comprimento da lista menos 1 para criar o mesmo intervalo.
A última parte é um verbo que leva uma lista no RHS e um índice no LHS que marca o índice inicial da comparação. Selecione os dois elementos começando nesse índice, classifique-os e conecte-os novamente à lista e retorne-o.
fonte
Matlab,
9391 bytesSalva 11 bytes ao omitir
if l(i)>l(i+1);l(i:i+1)=l([i+1,i])
e, em vez disso, basta classificar os dois elementos todas as vezes. Funciona para listas de tamanho 1. Pode salvar um ou dois bytes usando om--
operador Octave , mas isso não é muito.Salva mais dois bytes, definindo
n=numel(l)-1;
, porque então eu posso fazer emwhile n
vez dewhile n>1
e emi=mod(i,n)+1
vez dei=mod(i,n-1)+1
.Para constar, essa resposta foi escrita muitas horas após o desafio ter sido criado.
fonte
Groovy (101 bytes)
EDIT: Eu não precisava escrever meu próprio fechamento de swap, o groovy tinha isso incorporado.
Experimente aqui: https://groovyconsole.appspot.com/script/5104724189642752
Exemplo de Rastreio de Saída:
Implementação antiga (122 bytes)
Experimente aqui: https://groovyconsole.appspot.com/script/6316871066320896
fonte
php,
148145 bytesNão estou muito feliz com a estrutura do loop, mas gosto da opção de lista e funciona, por isso estou postando de qualquer maneira. O php7.1 me permitiria salvar pelo menos 4 bytes.
Com uma formatação melhor:
Edit: Jörg Hülsermann me lembrou da junção, em vez de implodir.
nota: precisa estar em um arquivo com um único nome de arquivo.
fonte
Ruby,
5250 bytesEspere ... não, Ruby?
fonte