APS - Ordenação
-void shellSort(Geo*, integer)
A função shell sort recebe como parâmetro uma structGeo*( ), e um inteiro size. Tendo como variáveis i, h e i do tipo inteiro, e value do tipo structGeo, que é utilizada como auxiliar na troca de posições. Variavel h recebe o valor de um e logo em seguida entra em um laço while onde tem a seguinte condição : enquanto (h < size) { h = 3* h + 1}. Por exemplo, o valor de size é 10, e h esta valendo 1, ao cair no laço while, h recebe o valor de 3*h+1 ( 3*1+1), sendo igual a 4. Como h ainda é menor que 10, repete outra vez, 3*h+1( 3*4+1), sendo igual a 13. Agora h é maior que 10, então h sai do laço while e vai para a próxima etapa que é entra em outro while, desta vez a repetição será enquanto h for maior que 1.
Dentro do laço, h é dividido por 3, desconsiderando o resto, e vai para o laço for, onde fica a seguinte condição : para(i=0 até size passo 1); value recebe qGeo[i], e j recebe i – h, e vai para o laço interno while com a seguinte condição : enquanto(j >= 0 ^ value.variavel < qGeo[j].variavel), qGeo[j+h] recebe qGeo[j], e j recebe j – h, e sai o while; e ainda dentro do for qGeo[j+h] = value;
Por exemplo, como h está valendo 13, ao entrar no laço é dividido por 3 e entra vai para a próxima etapa que é o laço for, onde i = h(4) e vai até size acrescentando de um em um; value recebe qGeo[i]; e j = i(4) – h(4); e entra no laço interno while, onde sua condição ( j >= 0 && value.variavel < qGeo[j].variavel) {qGeo[j(0)+h(4) = qGeo[j(0)]; j = j(0) – h(4); } dentro do for qGeo[j(0)+h(4) = value;
Na próxima estapa, agora é i = 5 e vai até size acrescentando de um em um; value recebe qGeo[i(5)]; e j = i(5) – h(4); e entra no laço interno while, onde sua condição ( j >= 0 && value.variavel < qGeo[j(].variavel) {qGeo[j(1)+h(4) = qGeo[j(1)]; j = j(1) – h(4); } dentro do for qGeo[j(1)+h(4) = value;
E segue este método sucessivamente até que seja ordenado.