Baixe Ordenação e outras Notas de estudo em PDF para Informática, somente na Docsity!
Ordenação
Última alteração: 10 de Outubro de 2006
∗Transparências elaboradas por Fabiano C. Botelho, Leonardo Rocha, Leo- nardo Mata e Nivio Ziviani
Projeto de Algoritmos – Cap.4 Ordenação 1
Ordenação
- Introdução - Conceitos Básicos
- Ordenação Interna - Ordenação por Seleção - Ordenação por Inserção - Shellsort - Quicksort - Heapsort - Ordenação Parcial ∗ Seleção Parcial ∗ Inserção Parcial ∗ Heapsort Parcial ∗ Quicksort Parcial
- Ordenação Externa - Intercalação Balanceada de Vários Caminhos - Implementação por meio de Seleção por Substituição - Considerações Práticas - Intercalação Polifásica - Quicksort Externo
Projeto de Algoritmos – Cap.4 Ordenação 3
Introdução - Conceitos Básicos
- Exemplo de ordenação por distribuição: considere o problema de ordenar um baralho com 52 cartas na ordem: A < 2 < 3 < · · · < 10 < J < Q < K e ♣ < ♦ < ♥ < ♠.
- Algoritmo:
- Distribuir as cartas abertas em treze montes: ases, dois, três,.. ., reis.
- Colete os montes na ordem especificada.
- Distribua novamente as cartas abertas em quatro montes: paus, ouros, copas e espadas.
- Colete os montes na ordem especificada.
Projeto de Algoritmos – Cap.4 Ordenação 4
Introdução - Conceitos Básicos
- Métodos como o ilustrado são também conhecidos como ordenação digital , radixsort ou bucketsort.
- O método não utiliza comparação entre chaves.
- Uma das dificuldades de implementar este método está relacionada com o problema de lidar com cada monte.
- Se para cada monte nós reservarmos uma área, então a demanda por memória extra pode tornar-se proibitiva.
- O custo para ordenar um arquivo com n elementos é da ordem de O(n).
- Notação utilizada nos algoritmos: - Os algoritmos trabalham sobre os registros de um arquivo. - Cada registro possui uma chave utilizada para controlar a ordenação. - Podem existir outros componentes em um registro.
Projeto de Algoritmos – Cap.4 Ordenação 6
Introdução - Conceitos Básicos
- A classe MeuItem define o tipo de dados i nt para a chave e implementa os métodos compara, alteraChave e recuperaChave.
- O método compara retorna um valor menor do que zero se a < b, um valor maior do que zero se a > b, e um valor igual a zero se a = b.
package cap4; import java. io. ∗ ; public class MeuItem implements Item { private int chave; / / outros componentes do registro
public MeuItem ( int chave ) { this .chave = chave ; }
public int compara ( Item i t ) { MeuItem item = (MeuItem) i t ; i f ( this .chave < item .chave) return −1; else i f ( this .chave > item .chave) return 1; return 0; } / / Continua na próxima transparência
Projeto de Algoritmos – Cap.4 Ordenação 7
Introdução - Conceitos Básicos
public void alteraChave ( Object chave) { Integer ch = ( Integer ) chave; this .chave = ch. intValue ( ) ; } public Object recuperaChave ( ) { return new Integer ( this .chave ) ; } }
- Deve-se ampliar a interface Item sempre que houver necessidade de manipular a chave de um registro.
- O método compara é sobrescrito para determinar como são comparados dois objetos da classe MeuItem.
- Os métodos alteraChave e recuperaChave são sobrescritos para determinar como alterar e como recuperar o valor da chave de um objeto da classe MeuItem.
Projeto de Algoritmos – Cap.4 Ordenação 9
Introdução - Conceitos Básicos
- Classificação dos métodos de ordenação: - Ordenação interna: arquivo a ser ordenado cabe todo na memória principal. - Ordenação externa: arquivo a ser ordenado não cabe na memória principal.
- Diferenças entre os métodos: - Em um método de ordenação interna, qualquer registro pode ser imediatamente acessado. - Em um método de ordenação externa, os registros são acessados seqüencialmente ou em grandes blocos.
Projeto de Algoritmos – Cap.4 Ordenação – Seção 4.1 10
Ordenação Interna
- Na escolha de um algoritmo de ordenação interna deve ser considerado o tempo gasto pela ordenação.
- Sendo n o número registros no arquivo, as medidas de complexidade relevantes são: - Número de comparações C(n) entre chaves. - Número de movimentações M (n) de itens do arquivo.
- O uso econômico da memória disponível é um requisito primordial na ordenação interna.
- Métodos de ordenação in situ são os preferidos.
- Métodos que utilizam listas encadeadas não são muito utilizados.
- Métodos que fazem cópias dos itens a serem ordenados possuem menor importância.
Projeto de Algoritmos – Cap.4 Ordenação – Seção 4.1 12
Ordenação Interna
- A classe mostrada a seguir apresenta os métodos de ordenação interna que serão estudados.
- Utilizaremos um vetor v de registros do tipo Item e uma variável inteira n com o tamanho de v.
- O vetor contém registros nas posições de 1 até n, e a 0 é utilizada para s entinelas.
package cap4. ordenacaointerna ; import cap4. Item ; / / vide transparência 6
public class Ordenacao { public static void selecao ( Item v [ ] , int n) public static void insercao ( Item v [ ] , int n) public static void shellsort ( Item v [ ] , int n) public static void quicksort ( Item v [ ] , int n) public static void heapsort ( Item v [ ] , int n) }
Projeto de Algoritmos – Cap.4 Ordenação – Seção 4.1.1 13
Ordenação por Seleção
- Um dos algoritmos mais simples de ordenação.
- Algoritmo: - Selecione o menor item do vetor. - Troque-o com o item da primeira posição do vetor. - Repita essas duas operações com os n − 1 itens restantes, depois com os n − 2 itens, até que reste apenas um elemento.
- O método é ilustrado abaixo: 1 2 3 4 5 6
Chaves iniciais: O R D E N A i = 1 A R D E N O i = 2 A D R E N O i = 3 A D E R N O i = 4 A D E N R O i = 5 A D E N O R
- As chaves em negrito sofreram uma troca entre si.
Projeto de Algoritmos – Cap.4 Ordenação – Seção 4.1.1 15
Ordenação por Seleção
Vantagens:
- Custo linear no tamanho da entrada para o número de movimentos de registros.
- É o algoritmo a ser utilizado para arquivos com registros muito grandes.
- É muito interessante para arquivos pequenos.
Desvantagens:
- O fato de o arquivo já estar ordenado não ajuda em nada, pois o custo continua quadrático.
- O algoritmo não é estável.
Projeto de Algoritmos – Cap.4 Ordenação – Seção 4.1.2 16
Ordenação por Inserção
- Método preferido dos jogadores de cartas.
- Algoritmo: - Em cada passo a partir de i=2 faça: ∗ Selecione o i-ésimo item da seqüência fonte. ∗ Coloque-o no lugar apropriado na seqüência destino de acordo com o critério de ordenação.
- O método é ilustrado abaixo: 1 2 3 4 5 6
Chaves iniciais: O R D E N A i = 2 O R D E N A i = 3 D O R E N A i = 4 D E O R N A i = 5 D E N O R A i = 6 A D E N O R
- As chaves em negrito representam a seqüência destino.
Projeto de Algoritmos – Cap.4 Ordenação – Seção 4.1.2 18
Ordenação por Inserção
Considerações sobre o algoritmo:
- O processo de ordenação pode ser terminado pelas condições: - Um item com chave menor que o item em consideração é encontrado. - O final da seqüência destino é atingido à esquerda.
- Solução: - Utilizar um registro sentinela na posição zero do vetor.
Projeto de Algoritmos – Cap.4 Ordenação – Seção 4.1.2 19
Ordenação por Inserção
Análise
- Seja C(n) a função que conta o número de comparações.
- No anel mais interno, na i-ésima iteração, o valor de Ci é:
melhor caso : Ci(n) = 1 pior caso : Ci(n) = i caso m´edio : Ci(n) = (^1) i (1 + 2 + · · · + i) = i+1 2
- Assumindo que todas as permutações de n são igualmente prováveis no caso médio, temos:
melhor caso : C(n) = (1 + 1 + · · · + 1) = n − 1 pior caso : C(n) = (2 + 3 + · · · + n) = n 22 + n 2 −^1 caso m´edio : C(n) = 12 (3 + 4 + · · · + n + 1) = n^2 4 +^
3 n 4 −^1