Como posso classificar uma lista de 5 números inteiros, de modo que, na pior das hipóteses, são necessários 7 comparações? Não ligo para quantas outras operações são executadas. Não sei nada de particular sobre os números inteiros.
Eu tentei algumas abordagens diferentes de dividir e conquistar, que me reduziram a 8 comparações, como seguir uma abordagem de mesclagem ou combinar mesclagem com o uso de pesquisa binária para encontrar a posição de inserção, mas toda vez que eu termino com 8 compara o pior caso .
No momento, estou apenas procurando uma dica, não uma solução.
algorithms
sorting
Robert S. Barnes
fonte
fonte
if(x > y)
é o mesmoif((x - y) & 0x80)
que dificilmente se compara. Eu acho que nós devemos esquecer que os objetos são inteiros e assumir devemos usar alguma mágicacompare(x, y)
função para comparar os objetos ...Respostas:
Há apenas uma maneira de iniciar esse processo (e para quase todas as suas decisões sobre o que comparar nas etapas posteriores, existe apenas uma correta). Aqui está como descobrir isso. Primeiro, observe que existem respostas possíveis que você pode obter para suas comparações e 5 ! = 120 permutações diferentes que você precisa distinguir.27= 128 5 ! = 120
A primeira comparação é fácil: você precisa comparar duas chaves e, como não sabe nada sobre elas, todas as opções são igualmente boas. Então, digamos que você comparar e b , e achar que a ≤ b . Agora você tem 2 6 = 64 respostas possíveis restantes e 60 permutações possíveis restantes (já que eliminamos metade delas).uma b a ≤ b 26= 64 60
Em seguida, podemos comparar e d , ou podemos comparar c a uma das chaves que usamos na primeira comparação. Se compararmos c e d , e aprender que c ≤ d , então temos 32 restantes respostas e 30 permutações possíveis. Por outro lado, se compararmos c com um , e descobrimos que uma ≤ c , temos 40 permutações possíveis restantes, porque temos eliminado 1 / 3 das permutações possíveis (aqueles com c ≤c d c c d c≤d 32 30 c a a≤c 40 1/3 ). Temos apenas 32 respostas possíveis, por isso estamos sem sorte.c≤a≤b 32
Então agora sabemos que temos que comparar a primeira e a segunda chaves e a terceira e quarta chaves. Podemos supor que temos e c ≤ d . Se compararmos e a qualquer uma destas quatro chaves, pelo mesmo argumento foi utilizado na etapa anterior, poderíamos só eliminar 1 / 3 das permutações remanescentes, e estamos sem sorte. Portanto, temos que comparar duas das teclas a , b , c , d . Considerando a simetria, temos duas opções: comparar a e c ou comparar a e da≤b c≤d e 1/3 a,b,c,d a c a d . Um argumento de contagem semelhante mostra que devemos comparar e c . Podemos assumir sem perda de generalidade que a ≤ c , e agora temos um ≤ b e um ≤ c ≤ d .a c a≤c a≤b a≤c≤d
Desde que você pediu uma dica, eu não vou passar pelo resto da discussão. Você tem quatro comparações restantes. Use-os com sabedoria.
fonte
Você pode encontrar isso em The Art of Computer Programming vol III, de D.Knuth, mas a estratégia é a seguinte (presumo que você tenha o array ): Se você quiser ler as dicas apenas duas primeiras linhas da minha resposta{a,b,c,d,e}
fonte