Shellsort Guj

477 palavras 2 páginas
view plaincopy to clipboardprint?
1. private static void shellSort ( int [ ] v )
2. {
3. int i , j , h = 1, value ;
4.
5. do {
6. h = 3 * h + 1;
7. } while ( h < v.length );
8. do {
9. h = h / 3;
10. for ( i = h; i < v.length; i++) {
11. value = v [ i ];
12. j = i - h;
13. while (j >= 0 && value < v [ j ]) {
14. v [ j + h ] = v [ j ];
15. j = j - h;
16. }
17. v [ j + h ] = value;
18. }
19. } 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:

view plaincopy to clipboardprint?
1. do {
2. h = 3 * h + 1;
3. } 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: view plaincopy to clipboardprint?
1. for ( i = h; i < v.length; i++) {
2. value = v [ i ];
3. j = i - h;
4.

Relacionados