logo

Algoritmo de classificação de shell

Neste artigo, discutiremos o algoritmo de classificação de shell. Shell sort é a generalização da ordenação por inserção, que supera as desvantagens da ordenação por inserção comparando elementos separados por um intervalo de várias posições.

É um algoritmo de classificação que é uma versão estendida da classificação por inserção. A classificação Shell melhorou a complexidade média do tempo da classificação por inserção. Assim como a classificação por inserção, é um algoritmo de classificação baseado em comparação e no local. A classificação Shell é eficiente para conjuntos de dados de tamanho médio.

Na classificação por inserção, os elementos podem ser movidos apenas uma posição por vez. Para mover um elemento para uma posição distante, são necessários vários movimentos que aumentam o tempo de execução do algoritmo. Mas a classificação por shell supera essa desvantagem da classificação por inserção. Também permite a movimentação e troca de elementos distantes.

Este algoritmo primeiro classifica os elementos que estão distantes uns dos outros e, posteriormente, reduz a lacuna entre eles. Essa lacuna é chamada de intervalo. Este intervalo pode ser calculado usando o Knuth fórmula fornecida abaixo -

 h = h * 3 + 1 where, 'h' is the interval having initial value 1. 

Agora, vamos ver o algoritmo de classificação de shell.

Algoritmo

As etapas simples para obter a classificação do shell estão listadas a seguir -

 ShellSort(a, n) // &apos;a&apos; is the given array, &apos;n&apos; is the size of array for (interval = n/2; interval &gt; 0; interval /= 2) for ( i = interval; i <n; i +="1)" temp="a[i];" for (j="i;" j>= interval &amp;&amp; a[j - interval] &gt; temp; j -= interval) a[j] = a[j - interval]; a[j] = temp; End ShellSort </n;>

Funcionamento do algoritmo de classificação Shell

Agora, vamos ver o funcionamento do algoritmo de classificação de shell.

java int em string

Para entender o funcionamento do algoritmo de classificação de shell, vamos pegar um array não classificado. Será mais fácil entender a classificação do shell por meio de um exemplo.

Deixe os elementos do array serem -

Algoritmo de classificação de shell

Usaremos a sequência original de classificação de shell, ou seja, N/2, N/4,....,1 como intervalos.

No primeiro loop, n é igual a 8 (tamanho do array), então os elementos estão no intervalo de 4 (n/2 = 4). Os elementos serão comparados e trocados se não estiverem em ordem.

Aqui, no primeiro loop, o elemento no 0ºposição será comparada com o elemento em 4ºposição. Se o 0ºelemento for maior, ele será trocado pelo elemento em 4ºposição. Caso contrário, permanece o mesmo. Este processo continuará para os elementos restantes.

No intervalo de 4, as sublistas são {33, 12}, {31, 17}, {40, 25}, {8, 42}.

Algoritmo de classificação de shell

Agora, temos que comparar os valores em cada sublista. Após a comparação, temos que trocá-los, se necessário, no array original. Depois de comparar e trocar, o array atualizado terá a seguinte aparência -

Algoritmo de classificação de shell

No segundo loop, os elementos estão no intervalo de 2 (n/4 = 2), onde n = 8.

Agora estamos tomando o intervalo de 2 para classificar o resto da matriz. Com intervalo de 2, serão geradas duas sublistas - {12, 25, 33, 40} e {17, 8, 31, 42}.

Algoritmo de classificação de shell

Agora, novamente temos que comparar os valores em cada sublista. Após a comparação, temos que trocá-los, se necessário, no array original. Depois de comparar e trocar, o array atualizado terá a seguinte aparência -

números abc
Algoritmo de classificação de shell

No terceiro loop, os elementos estão no intervalo de 1 (n/8 = 1), onde n = 8. Por fim, usamos o intervalo de valor 1 para classificar o restante dos elementos do array. Nesta etapa, a classificação shell usa classificação por inserção para classificar os elementos da matriz.

Algoritmo de classificação de shell

Agora, a matriz está classificada em ordem crescente.

Complexidade de classificação de shell

Agora, vamos ver a complexidade de tempo da classificação Shell no melhor caso, no caso médio e no pior caso. Veremos também a complexidade espacial da classificação Shell.

1. Complexidade de tempo

Caso Complexidade de tempo
Melhor caso O(n*logn)
Caso médio O(n*log(n)2)
Pior caso Sobre2)
    Melhor complexidade de caso -Ocorre quando não há necessidade de ordenação, ou seja, o array já está ordenado. A complexidade de tempo do melhor caso da classificação Shell é O(n*logn). Complexidade média do caso -Ocorre quando os elementos da matriz estão em uma ordem confusa que não está subindo nem descendo corretamente. A complexidade média do tempo do caso da classificação Shell é O(n*logn). Complexidade do pior caso -Ocorre quando os elementos da matriz precisam ser classificados na ordem inversa. Isso significa que você precisa classificar os elementos do array em ordem crescente, mas seus elementos estão em ordem decrescente. A complexidade de tempo de pior caso da classificação Shell é Sobre2).

2. Complexidade Espacial

Complexidade Espacial O(1)
Estábulo NÃO
  • A complexidade do espaço da classificação Shell é O(1).

Implementação de classificação Shell

Agora, vamos ver os programas do Shell classificados em diferentes linguagens de programação.

Programa: Escreva um programa para implementar a classificação Shell em linguagem C.

 #include /* function to implement shellSort */ int shell(int a[], int n) { /* Rearrange the array elements at n/2, n/4, ..., 1 intervals */ for (int interval = n/2; interval &gt; 0; interval /= 2) { for (int i = interval; i <n; i +="1)" { * store a[i] to the variable temp and make ith position empty int j; for (j="i;" j>= interval &amp;&amp; a[j - interval] &gt; temp; j -= interval) a[j] = a[j - interval]; // put temp (the original a[i]) in its correct position a[j] = temp; } } return 0; } void printArr(int a[], int n) /* function to print the array elements */ { int i; for (i = 0; i <n; 42 i++) printf('%d ', a[i]); } int main() { a[]="{" 33, 31, 40, 8, 12, 17, 25, }; n="sizeof(a)" sizeof(a[0]); printf('before sorting array elements are - 
'); printarr(a, n); shell(a, printf('
after applying shell sort, the return 0; < pre> <p> <strong>Output</strong> </p> <p>After the execution of above code, the output will be -</p> <img src="//techcodeview.com/img/ds-tutorial/72/shell-sort-algorithm-7.webp" alt="Shell Sort Algorithm"> <p> <strong>Program:</strong> Write a program to implement Shell sort in C++.</p> <pre> #include using namespace std; /* function to implement shellSort */ int shell(int a[], int n) { /* Rearrange the array elements at n/2, n/4, ..., 1 intervals */ for (int interval = n/2; interval &gt; 0; interval /= 2) { for (int i = interval; i <n; i +="1)" { * store a[i] to the variable temp and make ith position empty int j; for (j="i;" j>= interval &amp;&amp; a[j - interval] &gt; temp; j -= interval) a[j] = a[j - interval]; // put temp (the original a[i]) in its correct position a[j] = temp; } } return 0; } void printArr(int a[], int n) /* function to print the array elements */ { int i; for (i = 0; i <n; 41 i++) cout< <a[i]<<' '; } int main() { a[]="{" 32, 30, 39, 7, 11, 16, 24, }; n="sizeof(a)" sizeof(a[0]); cout<<'before sorting array elements are - 
'; printarr(a, n); shell(a, cout<<'
after applying shell sort, the return 0; < pre> <p> <strong>Output</strong> </p> <p>After the execution of the above code, the output will be -</p> <img src="//techcodeview.com/img/ds-tutorial/72/shell-sort-algorithm-8.webp" alt="Shell Sort Algorithm"> <p> <strong>Program:</strong> Write a program to implement Shell sort in C#.</p> <pre> using System; class ShellSort { /* function to implement shellSort */ static void shell(int[] a, int n) { /* Rearrange the array elements at n/2, n/4, ..., 1 intervals */ for (int interval = n/2; interval &gt; 0; interval /= 2) { for (int i = interval; i <n; i +="1)" { * store a[i] to the variable temp and make ith position empty int j; for (j="i;" j>= interval &amp;&amp; a[j - interval] &gt; temp; j -= interval) a[j] = a[j - interval]; /* put temp (the original a[i]) in its correct position */ a[j] = temp; } } } static void printArr(int[] a, int n) /* function to print the array elements */ { int i; for (i = 0; i <n; 40 i++) console.write(a[i] + ' '); } static void main() { int[] a="{" 31, 29, 38, 6, 10, 15, 23, }; int n="a.Length;" console.write('before sorting array elements are - 
'); printarr(a, n); shell(a, console.write('
after applying shell sort, the < pre> <p> <strong>Output</strong> </p> <p>After the execution of the above code, the output will be -</p> <img src="//techcodeview.com/img/ds-tutorial/72/shell-sort-algorithm-9.webp" alt="Shell Sort Algorithm"> <p> <strong>Program:</strong> Write a program to implement Shell sort in Java.</p> <pre> class ShellSort { /* function to implement shellSort */ static void shell(int a[], int n) { /* Rearrange the array elements at n/2, n/4, ..., 1 intervals */ for (int interval = n/2; interval &gt; 0; interval /= 2) { for (int i = interval; i <n; i +="1)" { * store a[i] to the variable temp and make ith position empty int j; for (j="i;" j>= interval &amp;&amp; a[j - interval] &gt; temp; j -= interval) a[j] = a[j - interval]; /* put temp (the original a[i]) in its correct position */ a[j] = temp; } } } static void printArr(int a[], int n) /* function to print the array elements */ { int i; for (i = 0; i <n; 39 i++) system.out.print(a[i] + ' '); } public static void main(string args[]) { int a[]="{" 30, 28, 37, 5, 9, 14, 22, }; n="a.length;" system.out.print('before sorting array elements are - 
'); printarr(a, n); shell(a, system.out.print('
after applying shell sort, the < pre> <p> <strong>Output</strong> </p> <p>After the execution of the above code, the output will be -</p> <img src="//techcodeview.com/img/ds-tutorial/72/shell-sort-algorithm-10.webp" alt="Shell Sort Algorithm"> <p>So, that&apos;s all about the article. Hope the article will be helpful and informative to you.</p> <hr></n;></n;></pre></n;></n;></pre></n;></n;></pre></n;></n;>