A classificação não faz sentido para uma matriz bidimensional ... ou faz?
Sua tarefa é pegar uma grade de entrada e aplicar um algoritmo do tipo bolha até que todos os valores na grade não diminuam da esquerda para a direita e de cima para baixo ao longo de cada linha e coluna.
O algoritmo funciona da seguinte maneira:
- Cada passagem vai linha por linha, de cima para baixo, comparando / trocando cada célula com seus vizinhos direito e abaixo.
- se a célula for maior que apenas uma de suas vizinhas direita e abaixo, troque pela célula que é maior que
- se a célula for maior que seus vizinhos direito e abaixo, troque com o vizinho menor
- se a célula for maior que seus vizinhos direito e abaixo, que têm o mesmo valor, troque com o vizinho abaixo.
- se a célula não for maior que qualquer um dos seus vizinhos direitos e abaixo, não faça nada
- Continue até que nenhuma troca seja feita durante todo o passe. Será quando todas as linhas e colunas estiverem em ordem, da esquerda para a direita e de cima para baixo.
Exemplo
4 2 1
3 3 5
7 2 1
A primeira linha do passe trocará o 4 e o 2, depois o 4 pelo 1.
2 1 4
3 3 5
7 2 1
Quando chegarmos ao meio 3, ele será trocado pelo 2 abaixo
2 1 4
3 2 5
7 3 1
Em seguida, o 5 é trocado pelo 1 abaixo
2 1 4
3 2 1
7 3 5
A última linha da primeira passagem move os 7 para a direita
2 1 4
3 2 1
3 5 7
Então voltamos à linha superior novamente
1 2 1
3 2 4
3 5 7
E continue linha por linha ...
1 2 1
2 3 4
3 5 7
... até que a grade seja "classificada"
1 1 2
2 3 4
3 5 7
Outro exemplo
3 1 1
1 1 1
1 8 9
torna-se
1 1 1
1 1 1
3 8 9
ao invés de
1 1 1
1 1 3
1 8 9
porque a troca descendente tem prioridade quando os vizinhos direito e abaixo de uma célula são iguais.
Uma implementação de referência passo a passo pode ser encontrada aqui .
Casos de teste
5 3 2 6 7 3 1 0
3 2 1 9 9 8 3 0
3 2 2 8 9 8 7 6
torna-se
0 0 1 1 2 2 3 6
2 2 3 3 6 7 8 8
3 3 5 7 8 9 9 9
2 1 2 7 8 2 1 0
2 2 2 2 3 2 1 0
1 2 3 4 5 4 3 2
9 8 7 6 5 4 3 6
6 5 4 3 2 2 1 0
torna-se
0 0 0 1 1 1 2 2
1 1 2 2 2 2 2 2
2 2 2 2 3 3 3 3
3 4 4 4 4 5 6 6
5 5 6 7 7 8 8 9
Regras
- Você pode pegar a grade de entrada em qualquer formato conveniente
- Você pode assumir que os valores da grade são todos números inteiros não negativos no intervalo de 16 bits não assinado (0-65535).
- Você pode assumir que a grade é um retângulo perfeito e não uma matriz irregular. A grade será pelo menos 2x2.
- Se você usar outro algoritmo de classificação, deverá fornecer uma prova de que ele sempre produzirá a mesma ordem resultante que essa marca específica de classificação de bolhas 2D, independentemente da entrada. Eu espero que isso seja uma prova não trivial, então você provavelmente está melhor usando o algoritmo descrito.
Golfe feliz!