Você está na página 1de 2

Ordenação por meio de incrementos decrescentes (Shell Sort)

Esse algoritmo é uma extensão do algoritmo da inserção direta (Ronald


L. Shell, 1959). A diferença com relação à inserção direta é o número
de segmentos do vetor. Na inserção direta é considerado um único
segmento do vetor onde os elementos são inseridos ordenadamente. No
método do Shell são considerados diversos segmentos.
A ordenação é realizada em diversos passos. A cada passo está
associado um incremento I, o qual determina os elementos que pertencem
a cada um dos segmentos:

segmento 1 - vet[1], vet[1 + I], vet[1 + 2I], ...


segmento 2 - vet[2], vet[2 + I], vet[2 + 2I], ...
...
segmento k - vet[k], vet[k + I], vet[k + 2I], ...

A cada passo todos os elementos (segmentos) são ordenados isoladamente


por inserção direta. No final de cada passo o processo é repetido para
um novo incremento I igual a metade do anterior, até que seja
executado um passo com incremento I = 1. O valor do incremento I é
sempre uma potência inteira de 2. O valor do incremento inicial é dado
por 2 ** NP, onde NP é o número de passos para ordenar o vetor
(fornecido pelo usuário, NP é uma aproximação inicial).

Assim, para NP = 3 o valor do incremento em cada passo seria:


I = 2**3 = 8
I = 2**2 = 4
I = 2**1 = 2
I = 2**0 = 1

Aplicando inserção direta em cada segmento. Nesse último passo os


elementos estão próximos das suas posições finais, o que leva a um
menor número de trocas. Aplicando inserção direta ao vetor obtido no
passo anterior obtém-se o vetor ordenado. Acompanhamento do algoritmo
para NP = 2:

Vetor original desordenado


17 24 42 15 21 22 47 37 52 43 27 12

Passo 1: I = 2NP = 4 (dividir o vetor em 4 partes)


17 21 52 29 22 43 42 47 27 15 37 12

Aplicando inserção direta em cada segmento, obtemos:


17 21 52 22 29 43 27 42 47 12 15 37

Geração de um novo vetor parcialmente organizado:


17 22 27 12 21 29 42 15 52 43 47 37

Passo 2: I = I DIV 2 = 2 (dividir o novo vetor em 2 partes)


17 27 21 42 52 47 22 12 29 15 43 37

Aplicando inserção direta em cada segmento:


17 21 27 42 47 52 12 15 22 29 37 43

Geração de um novo vetor desordenado:


17 12 21 15 27 22 42 29 47 37 52 43

Passo 3: I = I DIV 2 = 1 (simplesmente aplique inserção direta e


obtenha o vetor final)
12 15 17 21 22 27 29 37 42 43 47 52
Algoritmo em pseudo-código:

Constante
Tamanho = 12
Variáveis
Vetor[1..tamanho]: inteiro
Np, i, j, incremento: inteiro
Início
Leia Np
Para i  Np até 0 passo -1 faça
Inc  2**i
Para j  1 até inc faça
Shell_sort(vetor,incremento,j,tamanho)
Fim para
Fim para
Fim.

Procedimento Shell_sort(referência vetor, r, s, n)


Início
Variáveis
I, j, k, trab: inteiro
Achou: lógico
Para i  (s+r) até n passo r faça
J  s
Achou  “F”
Enquanto (j<i) e (não achou) faça
Se vetor[i] < vetor[j] então
Achou  “V”
Senão
J  j + r
Fim se
Fim enquanto
Se achou então
Trab  vetor[i]
K  i + r
Enquanto k > (j-r) faça
Vetor[k+r]  vetor[k]
K  k – r
Fim enquanto
Vetor[j]  trab
Fim se
Fim para
Fim Shell_sort

Exercício:

Aplicando a técnica Shell Sort, realize MANUALMENTE o procedimento de


ordenação dos seguintes números, dispostos em um vetor, usando NP = 2.

26 6 67 9 12 63 29 16