Classificação Hill da classificação do algoritmo javascript


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;

imagem.png

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
imagem.png

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!

Acho que você gosta

Origin blog.csdn.net/Long861774/article/details/126406164
Recomendado
Clasificación