Semana10-ordenacao-pesquisa-vetores
-
Upload
pedro-valente -
Category
Documents
-
view
548 -
download
0
Transcript of Semana10-ordenacao-pesquisa-vetores
Pedro Valente | Sónia Sobral
[pvalente|scrls]@upt.pt 26/11/2015
Algoritmia e Programação
Ordenação e Pesquisa
IMP.GE.87.0
Licenciatura em Informática 1º Ano, 1º Semestre
Licenciatura em Tecnologias e Sistemas de Informação 1º Ano, 1º Semestre
Agenda
Ordenação de vetores
• Ordenação por troca
• Ordenação Seleção
• Ordenação por partição (QuickSort)
• Ordenação por Inserção
Pesquisa
• Pesquisa Sequencial
• Pesquisa Binária
2
Objetivos
Contextualizar ordenação e pesquisa
Explorar os algoritmos de pesquisa Sequencial e Binária
Apresentar os algoritmos de ordenação por Troca, Seleção e por Inserção
3
introdução
Um vetor (também vulgarmente conhecido por Array), tem a capacidade em armazenar um conjunto de elementos consecutivos
Podem ser acedidos individualmente a partir de um único nome (conceito de variável).
Todos os valores do Vetor estão armazenados em memória (no formato lista).
E em alguns casos, é necessário ordenar para posterior pesquisa.
4
Introdução
Ordenação
• Operação realizada sobre registros
• Objetivo: organizar sobre determinada ordem
Pesquisa
• Operação realizada sobre registros
• Objetivo: localizar um registro
• Chave: campo ou chave presente em todos os registros
5
MÉTODOS DE ORDENAÇÃO
Quando trabalhamos com vetores (mais especificamente matrizes), existem ocasiões em que necessitamos ordena-los para facilitar as pesquisas.
• Podemos ordenar os valores de uma matriz do mais baixo para o mais alto (ordem crescente) ou ainda mais alto para o mais baixo (ordem crescente).
Sem esse tipo de ordenação toda e qualquer pesquisa numa matriz seria muito difícil e demorada.
Basicamente o que teria de se fazer é posicionar o “indice” no topo da matriz e ir comparando cada um dos elementos da matriz com o valor procurado.
Para uma matriz pequena, esse "método" não é algo tão complexo e talvez seja o mais utilizado.
• Mas para matrizes um pouco maiores, esse método consome muito tempo de processamento, tempo este que muitas vezes o sistema não dispões.
Nestes casos o melhor é ordenar a matriz para somente então começar as pesquisas.
6
MÉTODOS DE ORDENAÇÃO
Mas a ordenação, não irá também consumir tempo de processamento?!?
• Vai, mas apenas é realizada uma só vez!
• Durante a inicialização, ou quando o vetor sofre modificações e/ou atualizações
O tempo de processamento realizado numa ordenação é muito menor que o tempo de duas pesquisas feitas em uma base de dados desordenada.
• Sendo assim, vale a pena “ordenar”!
7
Ordenação de Vetores
Problema (ordenação de vetor)
Dado um vetor (𝑣) com N elementos, rearranjar esses elementos por ordem crescente. ou melhor, por ordem não decrescente, porque podem
existir valores repetidos.
Ideias base:
Existem diversos algoritmos de ordenação que são muito simples, mas com processamento mais demorado (ex: ordenação por Inserção, BubbleSort)
Existem algoritmos de ordenação mais difíceis de codificar que tem processamento menor.
8
Algoritmos de Ordenação de Vetores
Ordenação por Troca (BubbleSort)
Ordenação por Seleção
Ordenação por Inserção
Ordenação por Partição (QuickSort)
Outros algoritmos:
ShellSort – variante mais popular
MergeSort
HeapSort
9
Ordenação por Troca (BubbleSort)
Características:
O mais simples
O mais lento
Algoritmo: Bolha (bubble Sort)
Compara dois elementos
Se o elemento da esquerda for maior, troca-os
Mover uma posição à direita
Nota: acumula os elementos ordenados no
final do vetor
10
Ordenação por Troca (BubbleSort)
Fluxograma algoritmo
11
Ordenação por Troca (BubbleSort)
Código C
12
Output:
Ver demos 1 e 2
Ordenação por Seleção
Características Relativamente simples
Mais rápido que a ordenação por troca Mesmo número de comparações
Número menos de trocas
Mais indicado quando o tempo de troca for significativo
Método: Percorre o vetor e seleciona o menor elemento
Realiza a troca: transfere o menor elemento para o início
Nota: acumula os elementos ordenados no inicio do vetor
13
Ordenação por Seleção
14 More info: https://pt.wikipedia.org/wiki/Selection_sort
demo2
Ordenação por seleção
Código em C
15
Output:
Ver demo
Ordenação por Inserção
Algoritmo iterativo de N-1 passos
Em cada passo 𝑝: Coloca-se um elemento na ordem, sabendo que elementos
dos índices inferiores(entre 0 e 𝑝-1) já estão ordenados.
Algoritmo: 1. Considera-se o vetor dividido em dois sub-vetores
(esquerdo e direito), com o da esquerda ordenado e o da direita desordenado
2. Começa-se com um elemento apenas no sub-vetor da esquerda
3. Move-se um elemento de cada vez do sub-vetor da direita para o sub-vetor da esquerda, inserindo-o na posição correta por forma a manter o sub-vetor da esquerda ordenando.
4. Termina-se quando o sub-vetor da direita fica vazio
16 Mais info: https://web.fe.up.pt/~prog2/docs/vectorPesqOrd.pdf
Ordenação por Inserção
17
Ordenação por Inserção – código C
18
Output: Ver demo
Ordenação por Partição (QuickSort)
Algoritmo (ordenação por partição):
• Caso básico: Se o número (𝑛) de elementos do vetor (𝑣) a ordenar for 0 ou 1, não é preciso fazer nada.
• Passo de partição:
• Escolher um elemento arbitrário (𝑥) do vetor (chamado pivot)
• Partir o vetor inicial em dois sub-vetores (esquerdo e direito), com valores ≤ 𝑥 no sub-vetor esquerdo e valores ≥ 𝑥 no sub-vetor direito
Algoritmo recursivo baseado na técnica divisão e conquista
• quando parte do vetor a ordenar é de dimensão reduzida, usa um método de ordenação mais simples (ex. ‘insertionSort’ )
19 Mais info: https://web.fe.up.pt/~prog2/docs/vectorPesqOrd.pdf
Ordenação por Partição (QuickSort)
20
i j
≤ 𝒙 ≥ 𝒙
Ordenação por Partição (QuickSort)
21
Escolha pivot determina eficiência
Pior caso: pivot é o elemento mais pequeno
Melhor caso: pivot é o elemento médio
Caso médio: pivot corta vetor arbitrariamente.
Escolha do pivot:
Um dos elementos extremos do vetor
• Má escolha, se o vetor estiver ordenado
Elemento aleatório
• Envolve uso de mais uma função pesada
Mediana de três elementos (extremos do vetor e ponto médio)
• Recomendado!
Ordenação por Partição (QuickSort)
22
Output:
Ver demos 1 e 2
Nota: Uma forma de se fazer o quickSort é considerar o primeiro elemento como pivô
PESQUISA
Pesquisa sequencial e pesquisa binária
23
Pesquisa Sequencial
Problema (pesquisa de valor em vetor):
• Verificar se um valor existe no vetor e, no caso de existir, indicar a sua posição.
• Possíveis variantes para o caso de vetores com valores repetidos:
• A) indicar a posição da primeira ocorrência
• B) indicar a posição da última ocorrência
• C) indicar a posição de uma ocorrência qualquer
Algoritmo (pesquisa sequencial):
• Percorre sequencialmente todas as posições o vetor, da primeira para a última(a), ou da última para a primeira(b), até encontrar o valor pretendido ou chegar ao fim do vetor:
• A) caso de pretenda saber a posição da primeira ocorrência
• B) caso se pretenda saber a posição da última ocorrência
Adequado para vetores não ordenados ou pequenos
24
Pesquisa binária
Problema (pesquisa de valor em vetor
ordenado):
Verifica se um valor(x) existe num vetor (v)
previamente ordenado e, no caso de existir,
indicar a sua posição
No caso de vetores com valores repetidos,
consideramos a variante em que basta indicar a
posição de uma ocorrência qualquer
25
Pesquisa binária - algoritmo
Comparar o valor que se encontra a meio do vetor com o valor procurado, podendo acontecer 3 cenários:
• É igual ao valor procurado -> esta encontrado
• É maior do que o valor procurado ->continuar a procura (mesmo modo) no sub-vetor à esquerda da posição inspecionada
• É menor que o valor procurado -> continuar a procura (mesmo modo) no sub-vetor à direita da posição inspecionada
Se o vetor a inspecionar se reduzir a um vetor vazio, conclui-se que o valor procurado não existe.
26
Pesquisa binária - exemplo
27
Webgrafia
https://pt.wikibooks.org/wiki/Programar_em_C/Algoritmos_de_ordena%
C3%A7%C3%A3o
http://www.di.ubi.pt/~cbarrico/Disciplinas/ProgramacaoAlgoritmos/Down
loads/Teorica_Ordenacao_Recursiva.pdf
http://www.programmingsimplified.com/c-program-examples
[LER] http://epaperpress.com/sortsearch/download/sortsearch.pdf
28
IMP.GE.87.0