Aula 4 – Análise dos Algoritmos
de Ordenação
Cleyton Caetano de Souza IFPB – Campus Monteiro
Introdução
• Um método de ordenação pode ser
– Interna ou Extena – In-place ou não – Estável ou não
– Adaptativos ou não – Direto ou indireto
Interna x Externa
• Interna – São os métodos que não necessitam de uma memória secundária para o processo, a ordenação é feita na memória principal do computador
– Todos que estudamos foram algoritmos para ordenação em memória principal
• Externa – Quando o arquivo a ser ordenado não cabe na memória principal e, por isso, tem de ser armazenado em fita ou disco
in-place
• Uma ordenação pode ser in-place ou não • A ordenação in-place é a ordenação que é
efetuada com a própria sequência sem utilizar sequências adicionais
– Este método é utilizado em sistemas onde não se pode gastar memória adicional
Estável vs. Instável
• Um método é dito estável se a ordem relativa dos itens com a mesma chave não se altera durante o processo de ordenação.
Adaptativo
• Não adaptativos: sequência de operações independente da ordenação original dos dados
• Adaptativos: sequência de operações
dependente do resultado de comparações
Direto vs. Indireto
• Um algoritmo de ordenação é direto se os
dados que serão ordenados são os que estão sendo comparados e trocados; caso contrário é indireto.
– Exemplo
• Se a chave que se está utilizando para ordenar é
pequena, mas os dados satélites são grandes, não é interessante ordenar os dados diretamente.
• Basta trocar a informação que se quer ordenar pelos índices, ordenar os índices e utilizar a sequência de índices ordenados para ordenar os registros originais.
Análise Bolha
• Os elementos mais leves vão “borbulhando ” a cada iteração até a posição correta para
ordenação da lista • Características – Interna ou Externa – In-place ou não – Estável ou não – Adaptativo ou não
Custo do Bolha
• O bolha tem complexidade de caso médio e
pior caso igual a 𝐎 𝒏𝟐 , a sua complexidade de melhor caso é 𝑶 𝒏 .
– Dentre todos os algoritmos de ordenação
elementar é considerado o algoritmo com pior performance
Recomendação Bolha
• O bolha não é recomendado para a ordenação de sequência com muitos elementos, uma vez que rapidamente ele atinge tempos
impraticáveis.
• Sua vantagem e a facilidade de
implementação e pouco necessidade de espaço extra.
Análise Inserção Direta
• Insere cada elemento do vetor, na sua posição correta em uma subsequência ordenada de
elementos, de modo a mantê-la ordenada • Características
– Interna ou Externa
– In-place ou não
– Estável ou não
Custo Inserção Direta
• O bolha tem complexidade de caso médio e
pior caso igual a 𝐎 𝒏𝟐 , a sua complexidade de melhor caso é 𝑶 𝒏 .
– No geral, ele considerado superior ao Bolha, mas ainda assim é um algoritmo relativamente
Recomendação Inserção Direta
• Pode ser utilizado quando o vetor possui poucos elementos.
• É o método a ser utilizado quando o arquivo está “quase” ordenado.
Análise Seleção Direta
• Tem como principio de funcionamento selecionar o n-ésimo menor elemento do vetor e em seguida posicioná-lo na n-ésima posição correspondente do vetor.
• Características
– Interna ou Externa
– In-place ou não – Estável ou não
Custo Seleção Direta
• Como o algoritmo não é adaptativo, o custo no melhor caso, caso médio e pior caso é o
Recomendação Seleção Direta
• É um algoritmo relativamente simples, entretanto ainda considerado ineficiente • Ele se destaca quando o custo para fazer
trocar dentro da sequência que se deseja ordenar é muito elevado
– É recomendado para ordenar registros grandes e/ou sequências pequenas
Análise Shell
• Consiste em uma variação do Inserção
– De maneira geral ele, divide o vetor em vetores menores e nestes são aplicados o algoritmo de
ordenação por inserção tradicional, esse processo é repetido diversas vezes, a cada iteração para
subvetores maiores, até que o subvetor seja do tamanho do vetor. • Características – Interna ou Externa – In-place ou não – Estável ou não – Adaptativo ou não
Análise Shell
• No Insertion Sort, se os menores valores estão mais a direita na sequência, é necessário que muitas comparações sejam feitas, até que
esses números tenham a chance de ocupar o início da sequência
• O Shell reduz esse problema ao comparar números que estão a uma certa distância ℎ
– A determinação da sequência de valores que será considerada para ℎ é essencial para que o
Sequências para o ℎ famosas
• A questão sobre decidir qual a sequência ideal de ℎ é bastante difícil
– Qualquer sequência que contiver 1 levará ao ordenamento correto
– Entretanto, na prática o valor d ℎ impacta significativamente no desempenho do Shell
Sequências para o ℎ famosas
Termo Geral Sequência Complexidade do Pior Caso Proposto por 𝑁 2𝑘 𝑁 2 , 𝑁 4 , … , 1 Θ 𝑛2 Shell, 1959 2𝑝3𝑞 1, 2, 3, 4, 5, 6, 8, 9, 12 … Θ 𝑛 log 𝑛 2 Pratt, 1971 3𝑘 − 1 2 1, 4, 14, 40, 121 … Θ 𝑛3/2 Knuth, 1973 4𝑘 + 3 ∗ 2𝑘−1 + 1, começando de 1 1, 8, 23, 77, 281, … 𝑂 𝑛4/3 Sedgewick, 1986
Custo Shell
• O estudo da complexidade deste algoritmo
contém alguns problemas matemáticos muito difíceis,
– A começar pela própria escolha da sequencia de incrementos para ℎ.
• Ainda não existe uma análise matemática
completa e satisfatório que apresente um limite inferior para a performance do Shell
– A única certeza é que, dentre os algoritmos de
ordenação interna que tem ordem de complexidade quadrática, o ShellSort é o mais eficiente
Custo Shell
• Há alguns palpites mais difundidos utilizando sequências famosas para o ℎ
– Oscila em torno de O 𝑛3/2 , O 𝑛4/3 , 𝑶 𝒏𝟓/𝟒
ou 𝑶 𝒏 (𝐥𝐨𝐠 𝒏)𝟐 , no caso médio, sendo essas
duas em negrito as mais difundidas.
– Há quem diga que o custo pode no melhor caso
Recomendação Shell
• Shell é uma ótima opção para sequências de tamanho moderado
– Implementação relativamente simples, devido a ser uma variação do Inserção
– Diversos estudos sobre a sequência de ℎ mais eficiente
• Assim como o inserção, apresenta bom desempenho para sequências quase
Análise Mergesort
• É um algoritmo do tipo dividir para conquistar
– Também conhecido como intercalação ordenada
• Recursivamente a sequência é dividida em duas sequencias menores com metade do seu
tamanho original, esse processo acontece até que as sequências menores tenham tamanho 1.
• Quando as sequências menores passam a ter tamanho 1, o processo volta mesclando as sequências menores em um processo
Análise Mergesort
• Características
– Interna ou Externa – In-place ou não (?)
• Embora sua implementação clássica demande uma memória auxiliar, já existem implementações in-place. – Estável ou não (?)
• Embora ele possa se tornar estável tomando certos cuidados na operação de intercalação
Custo Mergesort
• Como o Mergesort não é adaptativo, seu custo para o pior caso, melhor caso e caso
médio é o mesmo e igual a 𝑶 𝒏 𝐥𝐨𝐠 𝒏 – A relação de recorrência do Mergesort é
𝑇 𝑛 = 2𝑇 𝑛2 + 𝑛
Recomendação Mergesort
• Vantagens do Mergesort
– Possui tempo de execução constante O 𝑛 log 𝑛 , que é um tempo considerado razoável
– Indicado para aplicações que tem restrições de tempo
• Uma desvantagem do Mergesort é que sua implementação necessita de uma memória auxiliar
– Além disso, na prática, ele costuma ser menos eficiente que o Quicksort, por exemplo.
Análise Quicksort
• Outro algoritmo do tipo dividir para conquistar • Recursivamente, é escolhido um elemento para
dividir a lista em duas partes: a primeira, com todos os elementos menores que o elemento escolhido; e a segunda, com todos os maiores.
– Esse elemento divisor é chamado de pivô
• Características
– Interna ou Externa
– In-place ou não – Estável ou não
Custo Quicksort
• Assim como o Shell, a análise da
complexidade do Quicksort não é algo tão simples
– Sua eficiência depende da escolha do pivô
• No pior caso, seu custo chega a 𝐎 𝒏𝟐
• No caso médio e melhor caso seu custo é 𝐎 𝒏 𝐥𝐨𝐠 𝒏
Recomendação Quicksort
• O QuickSort é considerado um do métodos mais eficientes e é altamente recomendável para sequências grandes.
– Quanto mais o vetor estiver desordenado, maior será sua vantagem em relação aos outros
métodos.
– Entretanto, a escolha correta do pivô é essencial para a garantia de eficiência do algoritmo.
Análise Heapsort
• O Heapsort é um algoritmo que faz uso de uma árvore binária chamada Heap Tree
– Na Max Heap Tree o nó pai é maior que os filhos e a raiz corresponde ao maior elemento da sequência
• Resumidamente, copia-se a raiz para a ultima posição do vetor (no caso da Max Heap Tree) e reconstrói-se a árvore, desconsiderando o último elemento da sequência
– Repete-se esse processo até que a sequência esteja ordenada
Análise Heapsort
• Características – Interna ou Externa – In-place ou não – Estável ou não – Adaptativo ou nãoCusto Heapsort
• Como o Heapsort não é adaptativo, seu custo para o pior caso, melhor caso e caso médio é o mesmo e igual a 𝐎 𝒏 𝐥𝐨𝐠 𝒏
– O custo para construir o heap a primeira vez é O 𝑛
– O custo para retirar a raiz é O 1
– O custo para corrigir o heap após uma remoção da raiz é O log 𝑛
Recomendação Heapsort
• Não é recomendado para sequências
pequenas, pois demanda um tempo extra para a construção do Heap
• De modo geral, o ciclo interno do Heapsort é mais complexo que o Quicksort e o Mergesort, o que pode fazer que em alguns casos
específicos ele seja bem menos eficiente que esses dois
Conclusão
• Os algoritmos podem ser divididos em dois grandes grupos:
– Menos eficientes: bolha, inserção e seleçõa
– Mais eficientes: heapsort, mergesort, quicksort e shell
• O 𝑛 log 𝑛 é considerado um limite teórico para o problema de ordenação
– Em tese, é impossível um algoritmo que ordena um vetor utilizando apenas comparações ser mais
eficiente que O 𝑛 log 𝑛
Algoritmos de Ordenação com custo linear
• Os algoritmos de distribuição são, na teoria, mais eficientes que os estudados até agora
– Entretanto, eles exigem algum outro tipo de conhecimento sobre os dados que deve ser
ordenados, portanto, não são tão genéricos como os vistos até agora.
– Os seguintes algoritmos tem complexidade O 𝑛 • Radix Sort
Análise Radixsort
• (Para números) Primeiro, ordena-se os elementos pela casa da unidade, depois dezena, depois centena e assim
sucessivamente, até a última casa decimal do maior número da sequência
– Além de números, o Radixsort também pode ser utilizado para ordenar outros tipos de elementos, como datas ou palavras, desde que esses elementos consistam em uma sequência de itens comparáveis • Características – Interna ou Externa – In-place ou não – Estável ou não – Adaptativo ou não
Custo Radixsort
• O custo do Radixsort, em qualquer caso, é 𝚯 𝒏𝒅 + 𝒌𝒅
– 𝑘 é o domínio dos possíveis valores – 𝑛 é o número de elementos
– 𝑑 é o número de dígitos
• O custo para ordenar por cada dígito é Θ 𝑛 + 𝑘
Recomendação Radixsort
• Esse algoritmo é particularmente eficiente
quando se tem muitos números a ordenar e as chaves são de tamanho pequeno.
Análise Distribuição de Chaves
• A lógica por trás da Distribuição de Chaves é descobrir para cada elemento 𝑥 da sequência o número de elementos menor que 𝑥
• Características
– Interna ou Externa – In-place ou não
– Estável ou não
Custo Distribuição de Chaves
• O custo da Distribuição de Chaves, em qualquer caso, é 𝐎 𝒏 + 𝒌
Recomendação Distribuição de Chaves
• Da mesma forma, esse algoritmo é
particularmente eficiente quando se tem
muitos números a ordenar e as chaves são de tamanho pequeno.
– Ou seja, quando 𝑘 < 𝑛
• Desvantagem
Algoritmos de Ordenação com custo linear
• Os algoritmos podem ser alterados para aumentar sua eficiência
– Exemplo
• Eu não preciso criar um vetor de 10 posições se o maior digito é 5, por exemplo.
• Eu não preciso começar o vetor de 0 se o menor dígito é 7, por exemplo.
• Embora os algoritmos sejam não adaptativos,
dependendo das características da sequência sua complexidade pode melhorar ou piorar
– Se o valor de 𝑘 for muito elevado esses algoritmos podem se tornar impraticáveis