Shellsort

8 respostas
S

Oi pessoal, alguém poderia me explicar de modo claro como o shellsort funciona? Eu preciso entender isso com clareza para expor em uma aula na próxima quinta feira. Ficarei muito grata se puderem me ajudar… :wink:

8 Respostas

J
B
private static void shellSort ( int [ ] v )
      {  
         int i , j , h = 1, value ;
        
         do {
            h = 3 * h + 1;
         } while ( h < v.length );
         do {
            h = h / 3;
            for ( i = h; i < v.length; i++) {
               value = v [ i ];
               j = i - h;
               while (j >= 0 && value < v [ j ]) {
                  v [ j + h ] = v [ j ];
                  j = j - h;
               }
               v [ j + h ] = value;
            }
      } while ( h > 1 );
Fonte: wikipedia

Bom, deixa eu tentar ser claro: (o bom seria se eu pudesse desenhar)

O Shellsort divide o seu vetor em várias partes e muitas vezes.

Funciona assim:
*a primeira coisa que ele faz é pegar o tamanho dos "pulos" para montar os vetorzinhos. através desse trecho:

do {
            h = 3 * h + 1;
         } while ( h < v.length );

Imagine um vetor de 10 posições:
7 2 5 6 3 1 0 8 9 4

supondo que "h" = 3, então:
7 6 0 4, será um dos vetorzinho pra ordenar. O que aconteceu aqui? "h" é o tamanho dos pulos para selecionar o primeiro vetor. (a cada três posições vc pega o primeiro elemento)

aí vc ordena esse vetor ficando:
0 4 6 7
0 2 5 4 3 1 6 8 9 7

Agora vc repita a operações acima só que ao inves de iniciar da posição 0, vc vai iniciar da posição 1, ficando selecionado:
0 2 5 4 3 1 6 8 9 7

ordene-os:
0 2 5 4 3 1 6 8 9 7

pega agora inciando da posição = 2
0 2 5 4 3 1 6 8 9 7

ordene-os:
0 2 1 4 3 5 6 8 9 7

Pronto! vc terminou a primeira parte da ordenação. Repare que agora o seu vetor estar semi ordenado. E tudo o que foi feito aí em cima se encontra nessa parte do código:
for ( i = h; i < v.length; i++) {
               value = v [ i ];
               j = i - h;
               while (j >= 0 && value < v [ j ]) {
                  v [ j + h ] = v [ j ];
                  j = j - h;
               }
               v [ j + h ] = value;
            }

Agora vc divide o h por 3, ficando igual a 1 e repita a operação de cima (vou fazer h = 2 pra explicar melhor)

Seu vetor se encontra assim:
0 2 1 4 3 5 6 8 9 7

Agora vamos repetir a operação de cima só que h = 2, selecioando:
0 2 4 3 5 6 8 9 7

ordene-a:
0 2 4 3 5 6 7 9 8

repita a operação pegando de posição = 1
0 2 4 3 5 6 7 9 8

ordene-a:
0 2 4 3 5 6 7 9 8

agora faça denovo só que com h = 1.

Espero ter ajuda um pouco.

B

pô moderador, na wikipedia num tá explicando o funcionamento da código não.

Eu ia passar essa fonte, só que lá não tem detalhe nenhum. aí eu tentei explicar por mim mesmo

S

Sua explicação foi excelente melhor q muitos livros e slides que consultei.
valeu mesmo… um grande beijo!!!

B

Sannie, que isso! Valeu pelos elogios…

qualquer coisa estamos aqui, é só perguntar.

H

Legal bbcbrenoPJ , era isso mesmo que eu tava precisando!

M

Amigo eu só não consegui intender o porque do h=3? tem algum valor lógico para escolher h? ou pode ser qualquer valor a seu critério?

N

E ordenar letras e linhas?

Criado 17 de outubro de 2006
Ultima resposta 22 de dez. de 2015
Respostas 8
Participantes 6