Artigo Diretório
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?
- Suponha que precisamos classificar o seguinte array.
- 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.
Para todos os elementos restantes, esse processo continuará.
- No segundo loop, pegue o intervalo de N / 4 = 8/4 = 2 e classifique os elementos nesses intervalos novamente.
Você pode estar confuso neste ponto.
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. - O mesmo processo é aplicado aos elementos restantes.
- 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.
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.