O documento apresenta vários algoritmos de ordenação e pesquisa de vetores, incluindo ordenação por troca, seleção, inserção e partição, bem como pesquisa sequencial e binária. Explica os conceitos-chave de ordenação e pesquisa e fornece pseudocódigo e código em C para cada algoritmo.
1. 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
2. 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
3. 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
4. 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
5. 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
6. 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
7. 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
8. 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
9. 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
10. 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
13. 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
16. 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
19. 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
21. 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!
22. 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ô
24. 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
25. 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
26. 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