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…
[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?