Shellsort

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:

[code]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 );[/code]

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:

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

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.

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

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

Sannie, que isso! Valeu pelos elogios…

qualquer coisa estamos aqui, é só perguntar.

Legal bbcbrenoPJ , era isso mesmo que eu tava precisando!

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?

E ordenar letras e linhas?