Compreenda o algoritmo de classificação de Hill

    Neste tutorial, você aprenderá como funciona o Hill Sort. Além disso, você encontrará exemplos em linguagem C.
    A classificação por Hill é um algoritmo que primeiro classifica os elementos separados uns dos outros e, em seguida, reduz o intervalo entre os elementos a serem classificados sucessivamente. É uma versão geral do tipo de inserção.
    Na classificação Hill, os elementos são classificados em um intervalo específico. O espaçamento entre os elementos diminui gradativamente de acordo com a ordem de uso. O desempenho da classificação de Hill depende do tipo de sequência usada para uma determinada matriz de entrada.
    Algumas das melhores sequências para usar são:

  • Sequência original de Hill: N / 2, N / 4, ..., 1
  • Incremento de Knuth: 1, 4, 13, ..., (3k - 1) / 2
  • Incremento Sedgewick: 1, 8, 23, 77, 281, 1073, 4193, 16577 ... 4j + 1 + 3 · 2j + 1
  • Incremento de Hibbard: 1, 3, 7, 15, 31, 63, 127, 255, 511 ...
  • Incrementos de Papernov e Stasevich: 1, 3, 5, 9, 17, 33, 65, ...
  • Pratt: 1, 2, 3, 4, 6, 9, 8, 12, 18, 27, 16, 24, 36, 54, 81 ...
Como funciona o Hill Sort?
  1. Suponha que precisamos classificar o seguinte array.
    Insira a descrição da imagem aqui
  2. No algoritmo, usamos a sequência original de Hill (N / 2, N / 4, ... 1) como o intervalo.
    No primeiro loop, se o tamanho do array for N = 8, os elementos com um intervalo N / 2 = 4 são comparados e trocados (se não estiverem em ordem).
    a. Compare o 0º elemento com o 4º elemento.
    b. Se o 0º elemento for maior que o 4º elemento, o 4º elemento é primeiro armazenado na variável temp, o 0º elemento (ou seja, o elemento maior) é armazenado na 4ª posição e o elemento armazenado em temp é armazenado Na 0ª posição.
    Insira a descrição da imagem aqui
        Para todos os elementos restantes, esse processo continuará.
    Insira a descrição da imagem aqui
  3. No segundo loop, pegue o intervalo de N / 4 = 8/4 = 2 e classifique os elementos nesses intervalos novamente.
    Insira a descrição da imagem aqui
        Você pode estar confuso neste ponto.
    Insira a descrição da imagem aqui
        O 4º e o 2º elementos são comparados, e o 2º e o 0º elementos também são comparados. Todos os elementos do intervalo atual na matriz são comparados.
  4. O mesmo processo é aplicado aos elementos restantes.
    Insira a descrição da imagem aqui
  5. Finalmente, quando o intervalo é N / 8 = 8/8 = 1, os elementos da matriz com um intervalo de 1 são classificados. A matriz agora está classificada.
    Insira a descrição da imagem aqui

Nota:
a legenda da segunda classificação do texto original está incorreta.
O primeiro intervalo é 4 e a matriz após a classificação é:

5 6 3 1 9 8 4 7

correto.
O segundo intervalo é 2, classificando 5,3,9,4 e 3,4,5,9 respectivamente, a matriz após a classificação é:

3 1 4 6 5 7 9 8

O terceiro intervalo é 1, e a matriz após a classificação é:

1 3 4 5 6 7 8 9
Pseudocódigo do algoritmo de classificação de Hill
shellSort(array, size)
  for interval i <- size/2n down to 1
    for each interval "i" in array
        sort all the elements at interval "i"
end shellSort
Exemplo C
// Shell Sort in C programming

#include <stdio.h>

// Shell sort
void shellSort(int array[], int n) {
    
    
  // Rearrange elements at each n/2, n/4, n/8, ... intervals
  for (int interval = n / 2; interval > 0; interval /= 2) {
    
    
    for (int i = interval; i < n; i += 1) {
    
    
      int temp = array[i];
      int j;
      for (j = i; j >= interval && array[j - interval] > temp; j -= interval) {
    
    
        array[j] = array[j - interval];
      }
      array[j] = temp;
    }
  }
}

// Print an array
void printArray(int array[], int size) {
    
    
  for (int i = 0; i < size; ++i) {
    
    
    printf("%d  ", array[i]);
  }
  printf("\n");
}

// Driver code
int main() {
    
    
  int data[] = {
    
    9, 8, 3, 7, 5, 6, 4, 1};
  int size = sizeof(data) / sizeof(data[0]);
  shellSort(data, size);
  printf("Sorted array: \n");
  printArray(data, size);
}
a complexidade

    A classificação de Hill é um algoritmo de classificação instável porque o algoritmo não verifica os elementos entre os intervalos.
    complexidade de tempo

  • Complexidade de pior caso: menor ou igual a O ( n 2 n ^ 2n2 )
        De acordo com o teorema de Poonen, a complexidade de pior caso de classificação de Hill éΘ (N log N) 2 / (loglog N) 2) Θ (Nlog N) ^ 2 / (log log N) ^ 2)Θ ( N l o g N )2 /(loglogN)2 )Θ (N log N) 2 / loglog N) Θ (Nlog N) ^ 2 / log log N)Θ ( N l o g N )2 /loglogN)Θ (N (log N) 2) Θ (N (log N) ^ 2)Θ ( N ( l o g N )2 )Ou algo no meio.
  • Complexidade do melhor caso: O (n * log n)
        Quando a matriz é classificada, o número total de comparações para cada intervalo (ou incremento) é igual ao tamanho da matriz.
  • Complexidade média do caso: O (n * log n) é
        aproximadamente O (n 1,25) O (n ^ {1,25})O ( n1 . 2 5 )

    A complexidade depende do intervalo selecionado. Para diferentes sequências de incremento selecionadas, a complexidade mencionada acima é diferente. A melhor sequência incremental é desconhecida.
    Complexidade do espaço: a complexidade do espaço da
    classificação Hill é O (1).

Aplicação Hill Sort

    Use a classificação Hill nas seguintes situações:

  • A pilha de chamadas é a sobrecarga diária. A biblioteca uClibc usa essa classificação.
  • A recursão excede o limite. O compressor bzip2 o usa.
  • Quando os elementos adjacentes estão distantes, o desempenho da classificação por inserção não é bom. A classificação de colina ajuda a encurtar a distância entre os elementos adjacentes. Portanto, o número de trocas a serem realizadas será menor.
Documentos de referência

[1] Parewa Labs Pvt. Ltd.Shell Sort Algorithm [EB / OL] .https: //www.programiz.com/dsa/shell-sort,2020-01-01.
[2] Baidu. Hill Sort [EB / OL] .https: //baike.baidu.com/item/Hill sorting, 2020-11-18.

Acho que você gosta

Origin blog.csdn.net/zsx0728/article/details/115040643
Recomendado
Clasificación