Estou procurando um algoritmo de classificação para matrizes int que não aloque nenhum byte que não seja o tamanho da matriz e esteja limitado a duas instruções:
SWAP: troca o próximo índice pelo atual;
MOVER: move o cursor para o índice +1 ou -1;
Ou seja, você não pode trocar índices não vizinhos nem trocar o índice 100
depois de trocar o índice 10
. Qual é o algoritmo mais eficiente - ou seja, aquele que usa a menor quantidade de movimentos totais?
algorithms
sorting
in-place
MaiaVictor
fonte
fonte
Respostas:
Considere a classificação de coqueteleira , que é uma versão bidirecional da classificação de bolhas. Você classifica de baixo para alto e depois (esta é a parte adicionada) classifica de alto para baixo, repetindo até terminar. Isso ainda é , mas gera significativamente menos passes em média, porque pequenos elementos próximos à extremidade superior da matriz serão movidos para sua posição final em uma única passagem em vez de N passes. Além disso, você pode acompanhar as posições mais alta e mais baixa em que ocorreu uma troca; passes subsequentes não precisam ser digitalizados além desses pontos.O ( n2)
fonte
O número de trocas de elementos adjacentes necessários para ordenar uma matriz é igual ao número de inversões na matriz. Com n elementos no total, há no máximo n * (n-1) / 2 inversões, portanto, a classificação de bolhas fornece o número assintoticamente ideal de swaps neste modelo.
fonte
O algoritmo que não usa um sinalizador booleano para saber se trocamos algum elemento ou não, é apresentado abaixo (o truque para manter as informações no estado da máquina e não na memória):
A solução de Eric Lippert, o tipo de gnomo, também funciona, porque basicamente é um tipo de bolha bidirecional.
fonte