5.9. A Ordenação Por Inserção¶
A ordenação por inserção, embora seja \(O(n^{2})\), funciona de uma forma ligeiramente diferente. Ela sempre mantém uma sublista ordenada nas posições inferiores da lista. Cada novo item é “inserido” na sublista anterior de modo que a sublista ordenada fique com um item a mais. A Figura 4 mostra o processo de ordenação por inserção. Os itens sombreados representam as sublistas ordenadas conforme cada passagem feita pelo algoritmo.
Começamos pressupondo que uma lista com um único item (posição \(0\)) está ordenada. A cada passagem, do item 1 a \(n-1\), o item atual é comparado com os que já estão na sublista ordenada. Conforme vamos caminhando de trás pra frente na sublista já ordenada, movemos os itens que são maiores para a direita. Quando encontramos um item menor ou chegamos ao fim da sublista, o item atual é inserido.
A Figura 5 mostra a quinta passagem em detalhe. Nesse ponto do algoritmo, há uma sublista com cinco itens: 17, 26, 54, 77 e 93. Queremos inserir 31 nesse conjunto já ordenado. A primeira comparação faz com que o item 93 vá para a direita. Os itens 77 e 54 também são deslocados para frente. Quando o item 26 é encontrado, o processo de deslocamento para e o 31 é colocado na lacuna aberta. Temos agora uma sublista ordenada com seis itens.
A implementação da ordenação por inserção
(ActiveCode 1)
mostra mais uma vez que há \(n-1\) passagens para ordenar n itens. A
iteração começa na posição 1 e vai até a posição : math:n-1, uma vez que esses
são os itens que precisam ser inseridos nas sublistas ordenadas. A linha 8
realiza a operação de deslocamento que move um valor uma posição à direita na
lista, abrindo espaço para a inserção. Note que essa não é uma troca completa
da mesma maneira que foi mostrada em algoritmos anteriores.
O número máximo de comparações para uma ordenação por inserção é a soma dos primeiros \(n-1\) inteiros. De novo, isso é \(O(n^{2})\). Contudo, no melhor caso, apenas uma comparação é necessária a cada passagem. Esse seria o caso de uma lista já ordenada.
Uma observação importante sobre a diferença entre deslocamento e troca: em geral, a operação de deslocamento requer aproximadamente um terço de processamento de uma troca, já que apenas uma atribuição é feita. Em estudos de desempenho, a ordenação por inserção costuma mostrar ótimos resultados.
Autoavaliação
- Q-2: Suponha que você tenha a seguinte lista de números para ordenar: <br>
[15, 5, 4, 18, 12, 19, 14, 10, 8, 20] qual lista representa a lista parcialmente ordenada depois três passagens completas da ordenação por inserção?
- [4, 5, 12, 15, 14, 10, 8, 18, 19, 20]
- Este é o bubble sort.
- [15, 5, 4, 10, 12, 8, 14, 18, 19, 20]
- Este é o resultado da ordenação por seleção.
- [4, 5, 15, 18, 12, 19, 14, 10, 8, 20]
- A ordenação por inserção começa pelo início da lista. Cada passagem produz uma lista ordenada maior.
- [15, 5, 4, 18, 12, 19, 14, 8, 10, 20]
- A ordenação por inserção não trabalha a partir do final da lista.