Shell Sort
Conceito
Shell sort é uma extensão do insertion
sort baseado em:
 Insertion
sort é bastante eficiente quando
a entrada está parcialmente classificada
 Insertion sort é ineficiente no caso geral
pois move os valores apenas uma posição
a cada vez
2
Descrição (1)
A proposta consiste em re-arrumar
objetos com intervalos maiores que
decrescerão até chegar ao intervalo 1
A etapa final é um verdadeiro Insertion
sort porém sobre um array de dados
quase completamente classificado
3
Descrição (2)
O processo consiste em
 Distribuir
a seqüência de dados a classificar
em um “array” bidimensional
 Classificar as colunas desse “array”
O processo se repete reduzindo número de
colunas do “array” até alcançar o valor 1
4
Descrição (3)
Os itens contidos em cada sub-lista não são
contíguos
Se houver 3 sub-listas cada sub-lista será
composta pelo i-ésimo elemento
No caso de 3 sub-listas



A primeira conterá os elementos das posições 1, 4, 7 e
assim por diante
A segunda conterá os elementos das posições 2, 5, 8 e
assim por diante
A terceira conterá os elementos das posições 3, 6, 9 e
assim por diante
5
Exemplo de shell sort (1)
Considere-se a seqüência de dados que se deseja
classificar
37905168420615734982
Inicia-se distribuindo a seqüência em um
determinado número de colunas
No exemplo serão consideradas 7 colunas
Cada coluna é classificada de cima para baixo em
ordem ascendente
A distribuição da esquerda é antes da classificação
e a da direita depois da classificação
6
Exemplo de shell sort (2)
3790516
3320515
8 4 2 0 6 1 5 -> 7 4 4 0 6 1 6
734982
879982
A seqüência assim obtida é redistribuída em
um número menor de colunas, 3 por
exemplo, e o processo repetido
7
Exemplo de shell sort (3)
332
051
574
4 0 6 ->
168
799
82
001
122
334
456
568
779
89
8
Exemplo de shell sort (4)
Basta agora distribuir em uma coluna e
repetir o processo uma última vez
Para caber em um slide a coluna será
exibida transposta
0 0 1 1 2 2 3 3 4 4 5 6 5 6 8 7 7 9 8 9
0 0 1 1 2 2 3 3 4 4 5 5 6 6 8 7 7 8 9 9
9
Exemplo de shell sort (5)
A seqüência de dados não é
distribuída em um “array”
bidimensional mas mantida em um
“array” unidimensional
adequadamente indexado
10
Número de “colunas”
Seja h o número de colunas a adotar
Para calcular a seqüência de valores de h pode-se adotar,
por exemplo
hM = 1, hM-1 = hM * 3 + 1
O resultado obtido é
..., 1093, 364, 121, 40, 13, 4, 1
Antes de iniciar a classificação é preciso determinar o
valor inicial de h (aproximadamente um terço do tamanho
do “array” a classsificar)
int h = 1; //valor inicial de h
while (h <= len / 3)
h = h * 3 + 1;
// (1, 4, 13, 40, 121, ...)
11
Programa com Shell Sort (1)
De://www.java2s.com/ExampleCode/Collections-Data-Structure/Shellsort.htm
public class ShellSort {
private long[] data;
private int len;
public ShellSort(int max) {
data = new long[max];
len = 0;
}
public void insert(long value){
data[len] = value;
len++;
}
public void display() {
System.out.print("Data:");
for (int j = 0; j < len; j++)
System.out.print(data[j] + " ");
System.out.println("");
}
12
Programa com Shell Sort (2)
public void shellSort() {
int inner, outer;
long temp;
int h = 1; //valor inicial de h
while (h <= len / 3)
h = h * 3 + 1; // (1, 4, 13, 40, 121, ...)
while (h > 0) // decrementar h, até que h=1
{ // classificar por colunas
for (outer = h; outer < len; outer++) {
temp = data[outer];
inner = outer;
// um sub-passo (por exemplo 0, 4, 8)
while (inner > h - 1 && data[inner - h] >= temp) {
data[inner] = data[inner - h];
inner -= h;
}
data[inner] = temp;
}
h = (h - 1) / 3; // decrementar h
}
}
13
Programa com Shell Sort (3)
public static void main(String[] args) {
int maxSize = 10;
ShellSort arr = new ShellSort(maxSize);
for (int j = 0; j < maxSize; j++) {
long n = (int) (java.lang.Math.random() * 99);
arr.insert(n);
}
arr.display();
arr.shellSort();
arr.display();
} // fim de main
} // fim de ShellSort
14
Download

Shell Sort