Você está na página 1de 49

ALGORITMOS E Prof.

Raul Sidnei

PROGRAMAÇÃO Wazlawick
12. BUSCA E
ORDENAÇÃO
 Busca sequencial
 Busca binária
 Insertion sort
 Bubble sort
 Quicksort
 Funções de ordenação disponíveis
em Python
BUSCA SEQUENCIAL
 Quando precisamos encontrar um ou mais elementos específicos em
uma lista.
 Na busca sequencial procuramos a partir do início da lista, verificando a
cada instante o próximo elemento.
LENDO UMA LISTA A PARTIR
DE UM ARQUIVO
Retorna uma string
semelhante, mas sem
os espaços no início e
no fim
BUSCA NA LISTA POR
PESSOAS COM FEBRE
POSSÍVEIS PADRÕES DE
BUSCA
a) Verificar se existe ou não na lista um elemento
correspondendo a uma certa regra.
 Por exemplo, verificar se existe pelo menos uma pessoa na lista com
febre. A resposta será "True" ou "False".

b) Verificar quantos elementos correspondendo a uma certa


regra existem em uma lista.
 Por exemplo, verificar quantas pessoas com febre existem na lista. A
resposta será um número inteiro não negativo.
Obrigatoriamente
c) Verificar quais elementos correspondendo a uma certa passam por toda a lista

regra estão em uma lista.


 Por exemplo, verificar quais pessoas na lista têm febre. A resposta
será uma lista de elementos (pessoas, no caso).
PADRÃO “A”: VERIFICAR SE UM
ELEMENTO ESTÁ NA LISTA
 Por exemplo, verificar se há alguém com febre na lista.

 Usa-se “for-else” porque:


 A lista tem tamanho predefinido
 Se um elemento for encontrado, pode-se parar a busca.
PADRÃO “B”: CONTAR QUANTOS
ELEMENTOS NA LISTA TÊM UMA
CERTA CARACTERÍSTICA
 Por exemplo, quantas pessoas estão com febre?
 Usa-se “for” porque:
 É necessário passar pela lista toda
PADRÃO “C”: RETORNAR OS
ELEMENTOS COM UMA CERTA
CARACTERÍSTICA (FILTRO)
 Por exemplo, quais são as pessoas que estão com febre?
 Usa-se “for” porque:
 É necessário percorrer a lista toda
COMPLEXIDADE
 Em função do tamanho da lista, quantos elementos são verificados em
cada caso.
 No caso dos padrões “b” e “c”, se a lista tem n elementos, então os n
elementos tem que ser verificados.
 No caso do padrão “a” existem diferentes possibilidades:
 Melhor caso: encontrar o elemento na primeira posição (1 comparação).
 Pior caso: não encontrar o elemento na lista (n+1 comparações).
 Caso médio: a média do número de verificações em todos os casos possíveis.
No caso, esse valor seria (n+1)/(m+1), onde “m” é o número de pessoas na
lista que têm febre.
BUSCA BINÁRIA
 Só é possível quando a lista está ordenada de acordo com algum
critério.
 Primeiramente, verifica-se o elemento no centro da lista.
 O centro da lista é o elemento na posição n//2, onde “n” é o número de
elementos na lista.
EXEMPLO
 Buscamos o número 80 na lista
 A lista tem 9 elementos
 A posição central é 9//2, ou seja, 4.

Este é o melhor caso


MAS SUPONHA QUE
ESTIVÉSSEMOS PROCURANDO
157
 Então ele não vai estar na posição central.
 Mas podemos descartar para a busca a lista desde o início até o
elemento central, porque devido à ordenação ele necessariamente vai
estar depois
SUPONHA QUE ESTIVÉSSEMOS
PROCURANDO O 12
 Então descartamos o elemento central e os maiores que ele
APLICAÇÃO RECURSIVA DA
BUSCA
 busca_binária(50, [10, 30, 50, 80, 120, 240, 600])
 80 é o elemento central
 Ele é maior que o elemento buscado
 Repete-se a busca na parte inicial da lista

 busca_binária(50, [10, 30, 50])


 30 é o elemento central
 Ele é menor que o elemento buscado
 Repete-se a busca na parte final da lista

 busca_binária(50, [50])
 50 é o elemento central
 Elemento encontrado!
A FUNÇÃO DE BUSCA
BINÁRIA RECURSIVA

Esta versão só diz se o elemento está ou não na lista


DIFERENÇA ENTRE A
COMPLEXIDADE DA BUSCA
SEQUENCIAL E BINÁRIA
UMA VERSÃO QUE RETORNA
A POSIÇÃO DO ELEMENTO
 Não pode retornar simplesmente a posição dele na última chamada
recursiva, pois naquele momento a parte inicial da lista poderá ter sido
removida.
 Assim, quando se fizer a busca na parte final da lista, deve-se somar ao
índice, retornado o número de elementos que foram removidos da parte
inicial da lista.
 Este número de elementos corresponde exatamente ao valor da posição
do elemento central.
 Assuma também que quando o elemento não é encontrado a função
retorna -1 (ou None).
BUSCA BINÁRIA RECURSIVA
QUE RETORNA A POSIÇÃO DO
ELEMENTO
VERSÃO ITERATIVA DA
BUSCA BINÁRIA
 Classicamente, a busca binária é também apresentada na forma de um
algoritmo iterativo (não recursivo)
 Ele usa um comando "while" e duas variáveis para indicar a posição
inicial e final da lista a serem analisadas a cada repetição.
 A condição para parar o "while" é que o início e o fim sejam iguais, o
que indica que a lista está vazia.
 O elemento central, nesta versão, não é calculado como o tamanho
da lista dividido por 2, mas como a posição inicial somada à metade
da diferença entre a posição inicial e a final.
 A posição em que o elemento for encontrado, nesta versão, corresponde
à sua posição real na lista.
ORDENAÇÃO

Aqui se constrói uma nova lista na qual cada elemento é inserido na posição
correspondente para que a lista resultante fique ordenada.
INSERTION SORT
 Do segundo elemento até o fim da lista, verificar se o elemento está em
posição; senão, inseri-lo na posição desejada.
INSERTION SORT

• O algoritmo até parece eficiente, mas, em termos de computação, temos que


considerar que as mensagens "pop" e "insert" não são executadas em tempo
constante.
• Por exemplo, uma lista com um milhão de elementos na qual você executa um
"pop" em uma das primeiras posições, vai mover todos os elementos que
estão depois desta posição para a esquerda.
• De igual forma, o "insert" move todos os elementos após a posição de
inserção para a direita.
• Dependendo da forma como a lista está implementada internamente pela
linguagem, estas operações podem ser muito, muito lentas.
O PIOR CASO E O CASO MÉDIO
NÃO SÃO MUITO DIFERENTES
BUBBLE SORT
 Compara dois elementos contíguos do início até o fim da lista e troca-os
de lugar se o primeiro for maior que o segundo

 Mas isso não ordena a lista toda, apenas alguns pares.


BUBBLE SORT PARCIAL COM
APENAS UMA PASSADA

Para obter uma lista totalmente ordenada


podemos executar o algoritmo parcial várias
vezes sobre a lista até que nenhum par de
números seja trocado
BUBBLE SORT (COMPLETO)
ELEMENTOS QUE AFETAM O
TEMPO DESTE ALGORITMO
 Coelhos: valores grandes que deveriam estar no fim da lista, mas estão
no início. Com uma única passada eles são rapidamente movidos para
seu lugar.
 Tartarugas: valores pequenos que deveriam estar no início da lista, mas
estão no fim. Eles exigem várias passadas para serem movidos ao seu
lugar.
QUICKSORT (1959)

Sir Charles Anthony (Tony) Richard Hoare


(Ceilão, 1934)
FUNCIONAMENTO
 O quicksort funciona com dois índices: "esquerda“, que inicia no
começo da lista e é incrementado; e "direita“, que inicia no fim da lista e
é decrementado.
 Deve-se escolher um elemento qualquer da lista que é chamado de
"pivô".
 Pode ser, por exemplo, o elemento na posição central da lista ou qualquer
outro elemento que se queira usar.
O PIVÔ FUNCIONA COMO UM
CRITÉRIO DE COMPARAÇÃO DA
SEGUINTE FORMA:
 Incrementa-se o índice "esquerda" até ele se igualar ao índice "direita" ou até
encontrar um elemento que seja maior ou igual ao pivô.
 Decrementa-se o índice "direita" até ele se igualar ao índice "esquerda" ou até
encontrar um elemento que seja menor ou igual ao pivô.
 Então, se o índice "esquerda" for diferente de "direita", troca-se os elementos nas
posições respectivas entre si.
 Porém, se o índice "esquerda" for igual ao índice "direita", é porque todos os
elementos à esquerda dessa posição são menores do que o pivô e todos os
elementos à direita dessa posição são maiores do que o pivô.
 Neste ponto, procede-se recursivamente executando quicksort na lista formada
pelos elementos do início até uma posição antes dos índices que se encontram na
posição atual do pivô, que pode ter se movido, e na lista formada pelos elementos
da posição seguinte ao pivô até o fim da lista, desde que essas listas tenham pelo
menos 2 elementos.
 Se qualquer delas tiver menos de 2 elementos, não há nada a fazer, pois a lista com
um elemento é considerada ordenada.
EXEMPLO
CHAMADA À FUNÇÃO
RECURSIVA COM SEUS
ARGUMENTOS
A FUNÇÃO QUICKSORT EM SI
A EFICIÊNCIA DO QUICKSORT
Na função "quicksort" troque a linha:
posição_central = início+(fim-início)//2 por
posição_central = seleciona_pivô(lista).
FUNÇÕES DE ORDENAÇÃO
DISPONÍVEIS EM PYTHON
 Sort
 Sorted
SORT
 Somente para listas mutáveis (não funciona com tuplas)
SORTED
 Como retorna uma nova lista, funciona com outras estruturas também,
mas sempre retorna uma lista.
O TIPO ORIGINAL DA ESTRUTURA
PODE SER RESTABELECIDO POR
CONVERSÃO
NO CASO DE DICIONÁRIOS
 A função “sorted” retorna uma lista com as chaves ordenadas
“SORTED” COM ESTRUTURAS
COMPLEXAS
 pessoas =
[ ('João', 32, '5551223'), ('Pedro', 45, '5551819'), ('Maria', 29, '5556717’)]

 print(sorted(pessoas))
 Por default ordena pelo primeiro elemento da tupla, o nome.
 [('João', 32, '5551223'), ('Maria', 29, '5556717'), ('Pedro', 45, '5551819')]
ORDENANDO A PARTIR DE
OUTROS ELEMENTOS

 [('Maria', 29, '5556717'), ('João', 32, '5551223'), ('Pedro', 45, '5551819')]

Similarmente, para ordenar pelo telefone, se fosse o caso, usaríamos itemgetter(2).


ORDENANDO DO MAIOR
PARA O MENOR
TÓPICOS VISTOS NESTE
CAPÍTULO

Você também pode gostar