Apenas um lembrete, no local significa que ele usa a matriz transmitida e o algoritmo de classificação só pode usar espaço extra constante. Estável significa que os elementos com a mesma chave aparecem na mesma ordem na matriz classificada como no original.
Eu também estaria muito interessado no pior caso no lugar quicksort estável. Pelo que entendi, modificar quicksort para o pior caso O ( n ln n ) requer a seleção de um pivô adequado que destruiria a estabilidade que normalmente seria desfrutada.
Isso é puramente de interesse teórico e não tenho aplicação prática. Gostaria apenas de conhecer o algoritmo que possui todos esses três recursos.
algorithms
reference-request
sorting
in-place
user834
fonte
fonte
Respostas:
Existem vários algoritmos que são todos acima, e praticamente todos eles foram inventados nos últimos 30 anos.
Provavelmente, a mais agradável é a classe de algoritmos chamada de classificação em bloco , incluindo a versão (chamada WikiSort) de Kim e Kutzner em 2008. Não é apenas uma memória estável e completamente in loco (O (1) sobrecarga de memória no modelo transdicotômico); também é adaptável e, portanto, executará menos etapas para classificar listas quase classificadas, convergindo para comparações de O (n) no caso de uma lista já classificada. Você pode encontrar uma implementação em C, C ++ e Java aqui: https://github.com/BonzaiThePenguin/WikiSort
Também é interessante o algoritmo GrailSort (também uma classificação em bloco) de Huang e Langston (1989-1992), que realmente supera o WikiSort em vários tipos de casos de teste. Uma implementação C ++ está disponível aqui: https://github.com/Mrrl/GrailSort
fonte
Você pode escrever um mergesort estável no local. Veja isto para detalhes. Nas próprias palavras do autor:
Não copio o código aqui, mas você pode encontrá-lo no link ou verificando o C ++ STL. Informe-me se você gostaria que eu tentasse fornecer uma descrição mais detalhada do que está acontecendo aqui.
fonte
Por favor, tome isso como um longo comentário sobre alguns pensamentos práticos. Embora essa não seja uma resposta para sua pergunta, acho que você pode estar interessado nesta discussão em Python:
Fonte: bugs.python.org , autor: Tim Peters
Observe também que o Timsort tem bom desempenho em matrizes já classificadas.
Então, o Python usa o Timsort (que é o Mergesort com alguns ajustes) e, como eu observei a implementação do Java há alguns anos, também foi o Mergesort (acho que agora eles também usam o Timsort).
fonte