Buscar

Pesq Ord - Algoritmos de Ordenacao


Prévia do material em texto

1
Prof. Galdir Reges
Tópicos
Visão geral
Ordenação por seleção
Ordenação por inserção
Ordenação por intercalação 
(MergeSort)
Atividades
Introdução 2
Pesquisa diagnóstica
Introdução 3
Brainstorming: como 
ordenar rapidamente 
uma prateleira de livros 
pela ordem alfabética 
do titulo?
Algoritmos de Ordenação
Ordenar/classificar dados (isto é, colocar os dados em alguma 
ordem particular como crescente ou decrescente) é uma das 
aplicações mais importantes da computação. 
▪ Um banco classifica todos os cheques pelo número de conta, de modo 
que possa preparar extratos bancários individuais no final de cada mês. 
▪ As companhias telefônicas classificam suas listas de assinantes por 
sobrenome e, depois, pelo primeiro nome para facilitar a localização de 
números de telefone. 
▪ Praticamente todas as empresas devem classificar alguns dados e, 
muitas vezes, volumes GIGANTESCOS deles. 
Classificar dados é um problema intrigante, que faz uso intensivo 
do computador e que atrai esforços intensos de pesquisa.
Introdução 4
Algoritmos de Ordenação (2)
É importante entender que o resultado final — o array classificado 
— será o mesmo, independentemente do algoritmo que você 
utiliza para classificar o array. 
Vamos ver três algoritmos de classificação comuns. 
▪ Os dois primeiros — classificação por seleção e classificação por 
inserção — são fáceis de programar, mas ineficientes. O último algoritmo 
— a classificação por intercalação (merge) — é muito mais rápido que 
os outros dois mas é mais difícil de programar. 
Focamos a classificação de arrays de dados de tipo primitivo, ou 
seja, ints. Também é possível classificar arrays de objetos
de classe. 
Introdução 5
Custo de acesso nos algoritmos
Ordenação Interna (Ordenação de Vetores)
▪ Todos os elementos cabem na memória RAM e o custo de acesso é 
desprezado.
Ordenação Externa (Ordenação de Arquivos)
▪ Somente parte dos elementos cabem na memória RAM e o custo de 
acesso (disco) torna-se determinante. 
Introdução 6
Ordenação por seleção
 Fácil de implementar mas ineficiente. 
 Funcionamento:
▪ Toma o primeiro elemento como referência
▪ Procura pela menor elemento entre os n-1 elementos restantes
▪ Troca a posição do menor elemento com o elemento de referência 
▪ Resultado parcial : o primeiro elemento é o menor elemento
▪ Toma o segundo elemento como referência
▪ Procura pela menor elemento entre os n-2 elementos restantes
▪ Troca a posição do menor elemento com o elemento de referência
▪ Resultado parcial: o segundo elemento é o segundo menor elemento
▪ Repete o processo anterior até que o elemento n-1 seja usado como 
referência
▪ Resultado final: conjunto ordenado
Introdução 7
34 8 64 51 32 21
Ordenação por Seleção - Exemplo
ref
min
min
8 34 64 51 32 21
ref
min
min min
8 21 64 51 32 34
ref
min
min min
8 21 32 51 64 34
ref
min
min
8 21 32 34 64 51
ref
min
min
8 21 32 34 51 64
Ordenação por seleção – Exemplo (3)
https://www.cs.usfca.edu/~galles/visualization/ComparisonSort.ht
ml
Introdução 9
https://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html
Ordenação por seleção (2)
 Como um exemplo, considere o array
▪ 34, 56, 4, 10, 77, 51, 93, 30, 5, 52
 O algoritmo primeiro determina que o menor elemento desse array está 
contido no índice 2. O programa troca 4 por 34, resultando em
▪ 4, 56, 34, 10, 77, 51, 93, 30, 5, 52
 O programa então determina o menor valor entre os elementos restantes 
(todos os elementos, exceto 4). O programa troca 5 por 56, resultando em
▪ 4, 5, 34, 10, 77, 51, 93, 30, 56, 52
 Na terceira iteração, o programa determina o próximo menor valor (10) e o 
troca por 34.
▪ 4 5 10 34 77 51 93 30 56 52
 O processo continua até que o array seja completamente classificado.
▪ 4 5 10 30 34 51 52 56 77 93 Introdução 10
Implementação da ordenação por seleção
Demonstração do desenvolvimento em IDE
Imagem do código será apresentada online
Introdução 11
Ordenação por Seleção - Análise
Ordena com custo (n^2 –
n) / 2 no melhor, pior e 
médio casos
Qual o Big O?
▪ O(n^2)
O fato do arquivo já estar 
ordenado não ajuda em 
nada no tempo de 
execução, pois o tempo de 
execução continua a ser 
quadrático
Introdução 12
Ordenação por Inserção
Algoritmo simples que se assemelha ao processo de ordenação 
de uma mão de baralho
Introdução 13
Ordenação por Inserção (2)
Funcionamento:
▪ O algoritmo de inserção começa na posição 1 do vetor (posição de 
referência) e consiste de n-1 passos
▪ Para cada passo p, o algoritmo procura a posição adequada do elemento 
de referência entre p elementos anteriores do vetor 
▪ Caso o elemento anterior seja “maior” do que o elemento de referência, 
desloca-se o elemento uma posição no vetor, abrindo espaço paro o 
elemento de referência
▪ Após cada passo, o algoritmo garante que os p elementos anteriores do 
vetor estão ordenados
▪ A posição de referência é atualizada para o próximo elemento no vetor 
Introdução 14
34 8 64 51 32 210
8 34 64 51 32 210
8 34 64 51 32 210
8 34 64 64 32 210
Ordenação por Inserção - Exemplo
ref=8
ref=64
ref=51
ref=51
34 34 64 51 32 210 ref=8
8 34 51 64 32 210
8 32 34 51 64 210
8 34 51 64 32 210
8 34 51 64 64 210
8 34 51 51 64 210
ref=32
ref=32
ref=32
8 34 34 51 64 210 ref=32
ref=210
8 32 34 51 64 210
Ordenação por Inserção – Exemplo (2)
Ordenação por Inserção – Exemplo (3)
https://www.cs.usfca.edu/~galles/visualization/ComparisonSort.ht
ml
Introdução 17
https://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html
Análise da Ordenação por Inserção
 Chaves inicialmente ordenadas
▪ Ordena com custo (n – 1) no melhor 
caso
▪ Qual o big O?
• O(n) 
 Chaves inicialmente ordenadas na 
ordem reversa
▪ Ordena com custo (n^2 - n) / 2 = no pior 
caso
▪ Qual o Big O?
• O(n^2)
 Chaves distribuídas aleatoriamente
▪ Ordena com custo (n2 - n) / 4 = O(n^2) 
no caso médio Introdução 18
Implementação da ordenação por inserção
Baseado no código da ordenação da seleção, e na descrição do 
da ordenação por inserção, desenvolva o código da ordenação 
por inserção.
▪ Lembrando o funcionando:
• O algoritmo de inserção começa na posição 1 do vetor (posição de referência) e 
consiste de n-1 passos
• Para cada passo p, o algoritmo procura a posição adequada do elemento de 
referência entre p elementos anteriores do vetor 
• Caso o elemento anterior seja “maior” do que o elemento de referência, desloca-se o 
elemento uma posição no vetor, abrindo espaço paro o elemento de referência
• Após cada passo, o algoritmo garante que os p elementos anteriores do vetor estão 
ordenados
• A posição de referência é atualizada para o próximo elemento no vetor 
Introdução 19
Atividade – Algoritmo 
de ordenação 
 Implemente e descubra 
qual o algoritmo de 
ordenação comparando 
seu comportamento 
com os apresentados 
em:
 https://www.cs.usfca.ed
u/~galles/visualization/C
omparisonSort.html
Introdução 20
declare X[5], j ,i, aux numérico
//carregando os números no vetor
para i=0 até 4 faça
início
escreva “Digite o “, i +1, “o número: “
leia X[i]
fim
//ordenando de forma crescente
para j=1 até 4 faça
inicio
//laço que percorre da ultima posição a posição j do vetor
para i=4 até j faça passo -1
inicio
se(X[i] < X[i-1])
então inicio
aux=X[i]
X[i]=X[i-1]
X[i-1]=aux
fim
fim
fim
//mostrando o vetor ordenado
para i=0 ate 4 faça
inicio
escreva i+1,”o número: “, X[i]
fim
fim+algoritmo
https://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html
Ordenação por Intercalação - MergeSort
MergeSort é um excelente exemplo de um algoritmo recursivo 
que utiliza o mecanismo de dividir para conquistar para resolver o 
problema de ordenação.
Introdução 21
Ordenação por Intercalação – MergeSort (2)
Funcionamento:
▪ A operação fundamental do algoritmo MergeSort é fundir dois vetores já 
ordenados, tendo como resultado um vetor também ordenado.
▪ Como osvetores de entrada já estão ordenados, a obtenção do vetor 
resultante pode ser feita com somente uma passagem pelos dados de 
entrada.
▪ O algoritmo MergeSort funciona através da divisão recursiva do vetor 
original em duas partes até que a ordenação das partes se torne trivial 
(somente 1 elemento).
▪ Recursivamente, o algoritmo remonta as partes ordenadas até obter o 
vetor final ordenado.
Introdução 22
MergeSort - Exemplo
14 5 2 7 3 6 13 8
14 5 2 7 3 6 13 8
14 5 2 7 3 6 13 8
14 5 2 7 3 6 13 8
5 14 2 7 3 6 8 13
2 5 7 14 3 6 8 13
2 3 5 6 7 8 13 14
2 3 52 5 7 14 3 6 8 13
2 3 2 5 7 14 3 6 8 13
22 5 7 14 3 6 8 13
2 5 7 14 3 6 8 13Operação mais 
complicada : Fusão 
de dois vetores 
ordenados, 
resultando um vetor 
também ordenado
MergeSort – Fundindo dois Vetores Ordenados
2 3 5 6 72 5 7 14 3 6 8 13
2 3 5 62 5 7 14 3 6 8 13
2 3 5 6 7 8 13 14 2 5 7 14 3 6 8 13
2 3 5 6 7 8 13 2 5 7 14 3 6 8 13
2 3 5 6 7 82 5 7 14 3 6 8 13
MergeSort – Exemplo (3)
https://www.cs.usfca.edu/~galles/visualization/ComparisonSort.ht
ml
Introdução 25
https://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html
Análise do MergeSort
 Ordena com custo O(n log n)
 O problema com o MergeSort é que a 
memória requerida dobra por causa do 
vetor temporário.
 Existe também o problema do trabalho 
adicional de copiar os elementos para o 
vetor temporário e de volta para o vetor 
original.
 Esta característica faz do algoritmo de 
MergeSort uma péssima escolha para 
algoritmos de ordenação interna, mas a 
estratégia de fusão de vetores 
ordenados é emblemática nos 
algoritmos de ordenação externa. 
Introdução 26
Implementação da ordenação intercalação (MergeSort)
Professor apresenta o código funcionando.
Copiar, compilar e testar o código disponível no site do curso.
Introdução 27
Codigo parte 1
Introdução 28
Codigo parte2
Introdução 29
Parte 4
Introdução 30
Part 5
Introdução 31
Experimentos de análise
Testar o tempo de execução de pior caso dos algoritmos de 
ordenação por seleção, inserção e intercalação com arrays com 
100, 1.000, 10.000 e 100.000 elementos. Registar os tempos em 
planilha e gerar gráfico comparativo.
Introdução 32
Tópicos
Visão geral
Ordenação por seleção
Ordenação por inserção
Ordenação por intercalação 
(MergeSort)
Atividades
Introdução 33
Referências
 DEITEL, P. Java: Como Programar. Pearson, 2016.
 Ascencio, Ana. Araújo, Graziela. Estruturas de dados : algoritmos, análise da 
complexidade e implementações em JAVA e C/C++. São Paulo: Pearson 
Prendice Hall, 2010.
 DOBRUSHKIN, Vladimir A. Métodos para Análise de Algoritmos. LTC, 
03/2012.
 ZIVIANI, Nivio. Projeto de Algoritmos: com implementações em JAVA e C++. 
Cengage Learning Editores, 03/2012.
Introdução 34