Comprender el algoritmo de clasificación de Hill

    En este tutorial, aprenderá cómo funciona Hill Sort. Además, encontrará ejemplos que utilizan lenguaje C.
    La clasificación de colinas es un algoritmo que primero clasifica los elementos que están separados entre sí, y luego acorta el intervalo entre los elementos que se ordenarán sucesivamente. Es una versión general del ordenamiento por inserción.
    En la clasificación Hill, los elementos se clasifican en un intervalo específico. El espaciado entre elementos disminuye gradualmente según el orden de uso. El rendimiento de la clasificación Hill depende del tipo de secuencia utilizada para una matriz de entrada determinada.
    Algunas de las mejores secuencias para usar son:

  • Secuencia original de Hill: N / 2, N / 4,…, 1
  • Incremento de Knuth: 1, 4, 13,…, (3k - 1) / 2
  • Incremento de 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 y Stasevich: 1, 3, 5, 9, 17, 33, 65, ...
  • Pratt: 1, 2, 3, 4, 6, 9, 8, 12, 18, 27, 16, 24, 36, 54, 81…
¿Cómo funciona Hill Sort?
  1. Supongamos que necesitamos ordenar la siguiente matriz.
    Inserte la descripción de la imagen aquí
  2. En el algoritmo, usamos la secuencia original de Hill (N / 2, N / 4, ... 1) como intervalo.
    En el primer ciclo, si el tamaño de la matriz es N = 8, los elementos con un intervalo de N / 2 = 4 se comparan e intercambian (si no están en orden).
    a. Compare el elemento 0 con el elemento 4.
    b. Si el 0º elemento es mayor que el 4º elemento, el 4º elemento se almacena primero en la variable temp, el 0º elemento (es decir, el elemento más grande) se almacena en la 4ª posición y el elemento almacenado en temp se almacena En la posición 0.
    Inserte la descripción de la imagen aquí
        Para todos los elementos restantes, este proceso continuará.
    Inserte la descripción de la imagen aquí
  3. En el segundo ciclo, tome el intervalo de N / 4 = 8/4 = 2 y vuelva a ordenar los elementos en estos intervalos.
    Inserte la descripción de la imagen aquí
        Puede estar confundido en este punto.
    Inserte la descripción de la imagen aquí
        Se comparan los elementos 4º y 2º, y también se comparan los elementos 2º y 0º. Se comparan todos los elementos del intervalo actual en la matriz.
  4. El mismo proceso se aplica al resto de elementos.
    Inserte la descripción de la imagen aquí
  5. Finalmente, cuando el intervalo es N / 8 = 8/8 = 1, se ordenan los elementos de la matriz con un intervalo de 1. La matriz ahora está ordenada.
    Inserte la descripción de la imagen aquí

Nota:
La leyenda para la segunda clasificación del texto original es incorrecta.
El primer intervalo es 4 y la matriz después de ordenar es:

5 6 3 1 9 8 4 7

correcto.
El segundo intervalo es 2, ordenando 5,3,9,4 y 3,4,5,9 respectivamente, la matriz después de la ordenación es:

3 1 4 6 5 7 9 8

El tercer intervalo es 1 y la matriz después de ordenar es:

1 3 4 5 6 7 8 9
Pseudocódigo del algoritmo de clasificación de colinas
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
C ejemplo
// 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);
}
la complejidad

    La clasificación de colinas es un algoritmo de clasificación inestable porque el algoritmo no verifica los elementos entre intervalos.
    complejidad del tiempo

  • Complejidad en el peor de los casos: menor o igual que O ( n 2 n ^ 2norte2 )
        Según el teorema de Poonen, la complejidad del peor caso de clasificación de Hill esΘ (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 )O en algún punto intermedio.
  • Complejidad en el mejor de los casos: O (n * log n)
        Cuando se ordena la matriz, el número total de comparaciones para cada intervalo (o incremento) es igual al tamaño de la matriz.
  • Complejidad de caso promedio: O (n * log n) es
        aproximadamente O (n 1.25) O (n ^ {1.25})O ( n1 . 2 5 )

    La complejidad depende del intervalo seleccionado. Para diferentes secuencias de incremento seleccionadas, la complejidad mencionada anteriormente es diferente. Se desconoce la mejor secuencia incremental.
    Complejidad espacial: la complejidad espacial de la
    clasificación de Hill es O (1).

Solicitud de clasificación de colinas

    Utilice la clasificación Hill en las siguientes situaciones:

  • La pila de llamadas es la sobrecarga diaria. La biblioteca uClibc utiliza esta clasificación.
  • La recursividad supera el límite. El compresor bzip2 lo usa.
  • Cuando los elementos adyacentes están muy separados, el rendimiento de la ordenación por inserción no es bueno. La clasificación de colinas ayuda a acortar la distancia entre elementos adyacentes. Por tanto, el número de intercambios a realizar será menor.
Documentos de referencia

[1] Parewa Labs Pvt. Ltd. Algoritmo de clasificación de shell [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.

Supongo que te gusta

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