Endereço do evento: Desafio de aprendizado de 21 dias da CSDN
prefácio
Muitas pessoas já ouviram falar do algoritmo de ordenação clássico, e muitas pessoas podem tê-lo usado, mas também há muitas pessoas que nunca ouviram falar dele. por que? Agora que temos cada vez mais frameworks e pacotes dependentes, poderemos usar a própria cena de sorting e encapsulá-la em uma função como um negócio.Portanto, algumas pessoas só conhecem a função, mas não sua lógica de operação.
Com base no exposto, para entender melhor a lógica de operação da função, separei algumas regras de operação do método básico de classificação, bem como alguns entendimentos pessoais, na esperança de ajudá-lo.
Este artigo descreverá a classificação de Hill. Simplificando, a classificação de Hill é dividir a matriz e classificá-la separadamente;
Tipo de colina
Hill sort é um algoritmo de classificação rápida baseado em classificação por inserção, também conhecido como classificação incremental de redução. A classificação por inserção simples é lenta para grandes matrizes fora de ordem porque os elementos só podem ser movidos de uma extremidade da matriz para a outra, pouco a pouco. Hillsort simplesmente melhorou a classificação por inserção para velocidade e foi um dos primeiros algoritmos a quebrar O(n2).
Princípio de implementação do Hill sorting
- Agrupe a matriz de acordo com um determinado incremento e use o algoritmo de classificação por inserção direta para classificar cada grupo. A distância sugerida por Hill é N/2 e cada classificação é dividida em duas metades. Ou seja, para uma matriz com N =10, o incremento A sequência do espaçador é 5, 2, 1;
- Em seguida, reduza o incremento e continue agrupando e classificando; à medida que o incremento diminui gradualmente, cada grupo contém mais e mais palavras-chave. Quando o incremento diminui para 1, toda a matriz é dividida em um grupo e classificada novamente, a matriz inteira pode ser concluída .classificar;
o código
function shellSort(array) {
//每次向下得到一半的增量
for (let gap = Math.floor(array.length / 2); gap > 0; gap = Math.floor(gap / 2)) {
//每个分组进行插入排序
for (let i = gap; i < array.length; i++) {
let j = i;
let tmp = array[j];
// 如果同一组中 前数大于后数,则交换他们
if (array[j] < array[j - gap]) {
while (j - gap >= 0 && array[j - gap] > tmp) {
array[j] = array[j - gap];
j = j - gap;
}
array[j] = tmp;
}
}
}
console.log('shellSort result', array);
}
shellSort([2, 4, 7, 9, 0, 1, 2, 3, 5, 6, 8]);
valor de retorno
a complexidade
Complexidade de tempo:
- Melhor caso: a sequência é organizada em ordem positiva, neste caso, a operação de comparação precisa ser realizada (n-1) vezes. A operação de atribuição de retrocesso é 0 vezes. Isso é O(n)
- Pior caso: O(nlog2n).
- Complexidade de tempo assintótica (complexidade de tempo média): O(nlog2n)
Complexidade do espaço: O(2n)
mensagem
A classificação por colina é a mais instável em geral, mas, na melhor das hipóteses, é um método de classificação muito bom! Os prós e os contras são igualmente óbvios. Use com cuidado!