Aula 041669038801
Aula 041669038801
Aula 041669038801
Shell sort
O algoritmo de ordenação por inserção apresenta uma eficiência aceitável
somente em estruturas de dados pequenas. Quando aplicado em conjuntos maiores
ou mais complexos (que possuem elementos de valores menores posicionados nas
extremidades da estrutura), ele demora muito tempo para executar a tarefa. Isso
acontece, principalmente, porque a sua complexidade é determinada pelo termo
O(n²). Isso significa que o tempo exigido para a ordenação da matriz cresce mais
rápido que o seu tamanho. (NASCIMENTO; MOZZAQUATRO; ANTONIAZZI, 2016).
Em 1959, Donald Shell introduz o algoritmo shell sort (também conhecido como
diminuição do incremento) que apresenta uma eficiência aceitável em estruturas
maiores. Esse método de ordenação move os valores menores para um lado e os
maiores para o outro. Além disso, ao invés de organizar a matriz de uma única vez,
ele a subdivide em partes menores.
Em resumo, pode-se dizer que o gap cria novas submatrizes dentro da matriz
principal.
Vamos a um exemplo prático. Suponhamos a seguinte matriz de 12 elementos
(10 8 6 12 6 5 0 1 4 3 9 11) cujo gap é n/2, ou seja, 12/2 = 6. Tem-se, então, os valores
10, 0, 11 que representam respectivamente as posições zero, seis e onze da matriz.
Desta forma, temos:
Nesse momento, o GAP é dividido em duas partes, ou seja, GAP= 6/2 = 3. Tem-
se agora os números 0, 12, 10, 3 e 11 com índices das submatrizes resultantes.
Após o descobrimento do novo GAP, torna-se possível fazer a comparação dos
elementos mais espaçados. Esse processo continua até que as trocas de posição
sejam feitas por elementos adjacentes. Além disso, nada impede que, após o primeiro
GAP ser determinado, se aplique outros métodos de ordenação às submatrizes como,
por exemplo, o método de inserção.
Análise do algoritmo
Agora vamos ilustrar na prática o uso do algoritmo shell sort por meio da sua
implementação na linguagem Java, ordenando uma estrutura de dados array de nove
elementos do tipo inteiro.
Figura – Algoritmo de ordenação shell
Complexidade
A complexidade desse algoritmo é de O(n log n)^2) tanto no pior quanto no
melhor caso.
Counting sort
O algoritmo de ordenação por contagem conta a frequência com que cada
número ocorre na matriz. Em seguida, armazena esses contadores em uma matriz
auxiliar. (ELKAHLOUT; MAGHARI, 2017).
Esse algoritmo é baseado em chaves específicas. Além disso, como uma nova
matriz auxiliar é criada, pode-se classificá-lo como not-in-place.
Heap sort
O uso de um algoritmo por seleção para ordenar uma estrutura de dados resulta
em O(n2) operações. Por conta disso, perde-se muita eficiência ao aplicá-lo para
organizar uma grande quantidade de índices. (DEITEL; DEITEL, 2010).
O método heap faz uso de uma abordagem de ordenação por seleção. Desta
forma, ele escolhe o elemento que precede todos os outros, logo em seguida, o
segundo (n-1) e assim consecutivamente até a ordenação completa da matriz
(AREMU et al., 2013).
Em uma ordenação crescente, o maior elemento é colocado no final da matriz,
o segundo maior é posicionado antes dele e assim até que todos os valores estejam
em ordem. Esse padrão de comportamento é oposto ao da ordenação por seleção
que começa pelo início (lado esquerdo da matriz), selecionando os elementos
menores.
Heap é uma árvore binária com duas propriedades fundamentais:
• O valor principal não é maior que os nós filhos;
• Ocorre um balanceamento e as folhas no último nível estão posicionadas
mais à esquerda.
Figura– Árvore binária