Neste tutorial, você aprenderá como funciona a classificação de shell. Além disso, você encontrará exemplos de trabalho de classificação de shell em C, C ++, Java e Python.
A classificação de shell é um algoritmo que primeiro classifica os elementos distantes uns dos outros e reduz sucessivamente o intervalo entre os elementos a serem classificados. É uma versão generalizada do tipo de inserção.
Na classificação de shell, os elementos em um intervalo específico são classificados. O intervalo entre os elementos é reduzido gradualmente com base na sequência usada. O desempenho da classificação do shell depende do tipo de sequência usada para um determinado array de entrada.
Algumas das sequências ideais usadas são:
- Sequência original de Shell:
N/2 , N/4 ,… , 1
- Incrementos de Knuth:
1, 4, 13,… , (3k - 1) / 2
- Incrementos de Sedgewick:
1, 8, 23, 77, 281, 1073, 4193, 16577… 4j+1+ 3·2j+ 1
- Incrementos de Hibbard:
1, 3, 7, 15, 31, 63, 127, 255, 511…
- Incremento 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 a classificação Shell?
- Suponha que precisamos classificar o seguinte array.
Matriz inicial
- Estamos usando a sequência original do shell
(N/2, N/4,… 1
) como intervalos em nosso algoritmo.
No primeiro loop, se o tamanho do array forN = 8
then, os elementos situados no intervalo deN/2 = 4
serão comparados e trocados se não estiverem em ordem.- O 0º elemento é comparado com o 4º elemento.
- Se o 0º elemento for maior que o 4º então, o 4º elemento é primeiro armazenado na
temp
variável e o0th
elemento (isto é, o elemento maior) é armazenado na4th
posição e o elemento armazenadotemp
é armazenado na0th
posição.Reorganizar os elementos no intervalo n / 2
Este processo continua para todos os elementos restantes.Reorganizar todos os elementos no intervalo n / 2
- No segundo loop, um intervalo de
N/4 = 8/4 = 2
é obtido e novamente os elementos situados nesses intervalos são classificados.Reorganize os elementos no intervalo n / 4
Você pode ficar confuso neste ponto.Todos os elementos da matriz no intervalo atual são comparados.
Os elementos na 4ª2nd
posição e na posição são comparados. Os elementos na 2ª0th
posição e na posição também são comparados. Todos os elementos da matriz no intervalo atual são comparados. - O mesmo processo ocorre para os elementos restantes.
Reorganizar todos os elementos no intervalo n / 4
- Finalmente, quando o intervalo é
N/8 = 8/8 =1
, os elementos da matriz no intervalo de 1 são classificados. A matriz agora está completamente classificada.Reorganizar os elementos no intervalo n / 8
Algoritmo de classificação de shell
shellSort (array, size) para o intervalo i <- size / 2n até 1 para cada intervalo "i" no array classifica todos os elementos no intervalo "i" final shellSort
Exemplos de Python, Java e C / C ++
Python Java C C ++# Shell sort in python def shellSort(array, n): # Rearrange elements at each n/2, n/4, n/8,… intervals interval = n // 2 while interval> 0: for i in range(interval, n): temp = array(i) j = i while j>= interval and array(j - interval)> temp: array(j) = array(j - interval) j -= interval array(j) = temp interval //= 2 data = (9, 8, 3, 7, 5, 6, 4, 1) size = len(data) shellSort(data, size) print('Sorted Array in Ascending Order:') print(data)
// Shell sort in Java programming import java.util.Arrays; // Shell sort class ShellSort ( // Rearrange elements at each n/2, n/4, n/8,… intervals void shellSort(int array(), int n) ( for (int interval = n / 2; interval> 0; interval /= 2) ( for (int i = interval; i = interval && array(j - interval)> temp; j -= interval) ( array(j) = array(j - interval); ) array(j) = temp; ) ) ) // Driver code public static void main(String args()) ( int() data = ( 9, 8, 3, 7, 5, 6, 4, 1 ); int size = data.length; ShellSort ss = new ShellSort(); ss.shellSort(data, size); System.out.println("Sorted Array in Ascending Order: "); System.out.println(Arrays.toString(data)); ) )
// Shell Sort in C programming #include // 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 = 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(""); ) // 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: "); printArray(data, size); )
// Shell Sort in C++ programming #include using namespace std; // 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 = interval && array(j - interval)> temp; j -= interval) ( array(j) = array(j - interval); ) array(j) = temp; ) ) ) // Print an array void printArray(int array(), int size) ( int i; for (i = 0; i < size; i++) cout << array(i) << " "; cout << endl; ) // Driver code int main() ( int data() = (9, 8, 3, 7, 5, 6, 4, 1); int size = sizeof(data) / sizeof(data(0)); shellSort(data, size); cout << "Sorted array: "; printArray(data, size); )
Complexidade
A classificação de shell é um algoritmo de classificação instável porque esse algoritmo não examina os elementos situados entre os intervalos.
Complexidade de tempo
- Complexidade de pior caso : menor ou igual a A complexidade de pior caso para classificação de shell é sempre menor ou igual a . De acordo com o Teorema de Poonen, a complexidade do pior caso para classificação de shell é ou ou ou algo entre os dois.
O(n2)
O(n2)
Θ(Nlog N)2/(log log N)2)
Θ(Nlog N)2/log log N)
Θ(N(log N)2)
- Melhor caso de complexidade :
O(n*log n)
quando a matriz já está 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)
É próximo .O(n1.25)
A complexidade depende do intervalo escolhido. As complexidades acima diferem para diferentes sequências de incremento escolhidas. A melhor sequência de incremento é desconhecida.
Complexidade do espaço:
A complexidade do espaço para classificação de shell é O(1)
.
Aplicativos de classificação Shell
A classificação Shell é usada quando:
- chamar uma pilha é uma sobrecarga. A biblioteca uClibc usa esse tipo.
- a recursão excede um limite. O compressor bzip2 usa.
- A classificação por inserção não funciona bem quando os elementos próximos estão distantes. A classificação da concha ajuda a reduzir a distância entre os elementos próximos. Dessa forma, haverá menos troca de trocas a serem realizadas.