Qual algoritmo usa a Array#sort()
função JavaScript ? Entendo que podem ser necessários todos os tipos de argumentos e funções para realizar diferentes tipos de tipos; estou simplesmente interessado em qual algoritmo a classificação de baunilha usa.
javascript
algorithm
arrays
sorting
latortuga
fonte
fonte
Respostas:
Se você observar este bug 224128 , parece que o MergeSort está sendo usado pelo Mozilla.
fonte
Acabei de dar uma olhada na fonte do WebKit (Chrome, Safari ...) . Dependendo do tipo de matriz, diferentes métodos de classificação são usados:
Matrizes numéricas (ou matrizes do tipo primitivo) são classificadas usando a função de biblioteca padrão C ++,
std::qsort
que implementa alguma variação do quicksort (geralmente introsort ).Matrizes contíguas do tipo não numérico são estritas e classificadas usando mergesort, se disponível (para obter uma classificação estável) ou
qsort
se nenhuma classificação de mesclagem estiver disponível.Para outros tipos (matrizes não contíguas e presumivelmente para matrizes associativas), o WebKit usa a classificação por seleção (que eles chamam de classificação “min” ) ou, em alguns casos, classifica por meio de uma árvore AVL. Infelizmente, a documentação aqui é bastante vaga, portanto você teria que rastrear os caminhos de código para realmente ver quais tipos de métodos de classificação são usados.
E então existem gemas como este comentário :
- Vamos apenas torcer para que quem "corrige" isso tenha uma melhor compreensão do tempo de execução assintótico do que o autor deste comentário, e perceba que a classificação radix possui uma descrição do tempo de execução um pouco mais complexa do que simplesmente O (N).
(Obrigado ao phsource por apontar o erro na resposta original.)
fonte
Não há um requisito preliminar para o JS usar um algorthim de classificação específico. Como muitos mencionaram aqui, o Mozilla usa classificação por mesclagem. No entanto, no código-fonte v8 do Chrome, a partir de hoje, ele usa o QuickSort e o InsertionSort, para matrizes menores.
Fonte do mecanismo V8
Das linhas 807 - 891
Atualizar A partir de 2018, o V8 usa o TimSort, obrigado @celwell. Fonte
fonte
O padrão ECMAscript não especifica qual algoritmo de classificação deve ser usado. De fato, navegadores diferentes apresentam algoritmos de classificação diferentes. Por exemplo, sort () do Mozilla / Firefox não é estável (no sentido de classificação da palavra) ao classificar um mapa. O sort do IE () é estável.
fonte
Array.sort
; veja esta pergunta .Após mais algumas pesquisas, parece que, para o Mozilla / Firefox, o Array.sort () usa o mergesort. Veja o código aqui .
fonte
Eu acho que isso dependeria de qual implementação de navegador você está se referindo.
Todo tipo de navegador possui sua própria implementação de mecanismo javascript, portanto depende. Você pode verificar os repositórios de código-fonte do Mozilla e Webkit / Khtml para diferentes implementações.
No entanto, o IE é de código fechado, portanto, talvez você precise perguntar a alguém na microsoft.
fonte
A partir da V8 v7.0 / Chrome 70, a V8 usa o TimSort , o algoritmo de classificação do Python. O Chrome 70 foi lançado em 13 de setembro de 2018.
Veja a postagem no blog de desenvolvimento da V8 para obter detalhes sobre essa alteração. Você também pode ler o código-fonte ou o patch 1186801 .
fonte
A função Array.sort () do JavaScript possui mecanismos internos para selecionar o melhor algoritmo de classificação (QuickSort, MergeSort, etc.) com base no tipo de dados dos elementos da matriz.
fonte
tente isso com uma classificação rápida:
fonte