O algoritmo de classificação rápida pode ser dividido nas seguintes etapas
Identifique o pivô.
Particione a lista vinculada com base no pivô.
Divida a lista vinculada recursivamente em 2 partes.
Agora, se eu sempre escolher o último elemento como dinâmico, a identificação do elemento dinâmico (1º passo) leva tempo .
Após identificar o elemento pivô, podemos armazenar seus dados e compará-los com todos os outros elementos para identificar o ponto de partição correto (2ª etapa). Cada comparação levará tempo medida que armazenamos os dados do pivô e cada troca leva tempo . Portanto, no total, leva tempo para elementos.O ( n ) n
Portanto, a relação de recorrência é:
que é O ( n log n ), que é o mesmo que na classificação de mesclagem com uma lista vinculada.
Então, por que a classificação de mesclagem é preferida à classificação rápida para listas vinculadas?
Respostas:
O padrão de acesso à memória no Quicksort é aleatório, e também a implementação pronta para uso, por isso usa muitos swaps se as células atingirem o resultado ordenado.
Ao mesmo tempo, a classificação de mesclagem é externa, requer uma matriz adicional para retornar o resultado ordenado. Na matriz, isso significa sobrecarga de espaço adicional; no caso, se estiver vinculada à lista, é possível extrair valor e começar a mesclar nós. O acesso é mais seqüencial por natureza.
Por esse motivo, o quicksort não é a opção natural para lista vinculada, enquanto a classificação por mesclagem tira grande vantagem.
A notação Landau pode (mais ou menos, porque o Quicksort ainda é ) concordar, mas a constante é muito maior.O ( n2)
No caso médio, ambos os algoritmos estão em portanto o caso assintótico é o mesmo, mas a preferência é estritamente devido à constante oculta e, às vezes, a estabilidade é o problema (quicksort é inerentemente instável, mergsort é estável).O (nlogn )
fonte
Este é o algoritmo que o kernel do linux usa para classificar suas listas vinculadas. Embora com algumas otimizações extras, como ignorar o
previous
ponteiro durante toda, exceto a última operação de mesclagem.fonte
Você pode escrever classificação de mesclagem, classificação de partição, classificação em árvore e comparar resultados
É muito fácil escrever classificação em árvore, se você permitir algum espaço extra.
Para classificação em árvore, cada nó da lista vinculada deve ter dois ponteiros, mesmo se classificarmos lista vinculada individualmente
Na lista vinculada eu prefiro inserir e excluir em vez de trocar a
partição Hoare pode ser feita apenas para lista duplamente vinculada
Esse código precisa de algumas melhorias.
Primeiramente, devemos limitar o armazenamento extra às necessidades de recursão,
e tentar substituir a recursão pela iteração.
Se quisermos melhorar ainda mais o algoritmo, devemos usar a árvore de auto balanceamento.
fonte
Quicksort
Talvez eu mostre as etapas para o quicksort
Se a lista contiver mais de um nó
primeira sub- lista contém nós com chaves menores que a chave dinâmica A
segunda sub-lista contém nós com chaves iguais à chave dinâmica A
terceira sub-lista contém nós com chaves maiores que a chave dinâmica
Anúncio 1.
Se quisermos escolher o pivô rapidamente, a escolha é limitada.
Podemos escolher o nó principal ou o nó final
final. Nossa lista precisa ter um direcionador para o nó, se quisermos que nosso pivô
seja acessível rapidamente, caso contrário, precisamos procurar o nó.
Anúncio 2.
Podemos usar operações de fila para esta etapa.
Primeiro, desenfileiramos o nó da lista vinculada original,
comparamos sua chave com a chave dinâmica e o enfileiramos com o sublist correto. Os sublistas
são criados a partir de nós existentes e não há necessidade de
alocar memória para novos nós
O ponteiro para o nó da cauda será útil porque as operações da fila
e a concatenação são executadas mais rapidamente com a presença desse ponteiro
fonte