Você está na página 1de 26

AULA 3

ALGORITMOS DE BUSCA: BUSCA SEQUENCIAL E


BUSCA BINÁRIA EM LISTAS

P
rof. Jéssica Oliveira

1
Busca Inserção
Linear

Seleção
Modos Métodos

Busca Binária ALGORITIMO

Pesquisa Ordenação Método de Bolha

Hash
ITERATIV Quicksort
RECURSSIVO
O

Backtracking Gulosos Dinâmicos


Listas Lineares Sequenciais Ordenadas
Elementos da lista estão dispostos num vetor (contíguos
na
memória) e ordenado de acordo com alguma informação
A ordenação pode ser crescente ou decrescente
Exemplo:
 Ordenados crescente por nome
Ana 5.5 Bia 8.5 Leo 7.5 Ruy 10.0

 Ordenados decrescente pelo resultado

Ruy 10.0 Bia 8.5 Leo 7.5 Ana 5.5

3
Observações
Operação de inicialização, fundamental antes
de qualquer outra operação;
Verificação se a lista está vazia ou cheia, não mudam
se a lista está ou não ordenada;
Pode–se fazer uma busca seqüencial em uma lista
já ordenada;
Normalmente a operação de busca mais apropriada
em uma lista ordenada é a busca Binária;
A inserção, remoção em uma lista ordenada é
diferente, já que a ordenação dos elementos deve
ser mantida após estas operações.
4
Criação da Lista
Supondo uma lista de números reais.
A criação da lista se constitui na operação de
declaração das variáveis que descrevem a lista.
float v[10]; // lista propriamente dita – capacidade de 10
elementos
int n; // quantidade de elementos existentes em v

0 1 2 3 ... 6 7 8
9 ...

5
Inicialização da Lista
Numa Lista Linear Sequencial a inicialização se
constitui em atribuir 0 a quantidade de
elementos existente na lista (indicada pela
variável n)
n = 0;
9
0 1 2 3... ... 6 7
8

6
Inserção mantendo a Ordem
Consiste em adicionar um valor no vetor, mantendo
a ordem existente e ajustando o total de elementos.
Só pode ocorrer, no entanto, se a lista não estiver
cheia.
Protótipo:
void inserirEmOrdem(float [], float , int &, int);

7
Mecanismo de Inserção
 Supondo a lista ordenada, onde n == 6 (existem 6
elementos):
0 1 2 3 4 5 6 7 8 9
1.5 2.7 3.6 4.1 4.7 5.9

 Deseja-se inserir o valor 4.5


 Verifica-se se a lista está cheia, caso positivo, não pode inserir;
senão
 Inicia a comparação do 4.5 com o elemento da posição zero,
depois com o da posição 1, e assim por diante, até se encontrar um
valor maior que 4.5, que ocorrerá na posição 4 (esta será a posição
de inserção do 4.5)
0 1 2 3 4 5 6 7 8
1.5 2.7 3.6 4.1 4.7 5.9
9
8
Mecanismo de Inserção
Desloca-se os elementos para direita, a partir da
última posição (no exemplo, é a posição 5) para
posição seguinte, até a posição de inserção do 4.5
(posição 4)
0
1.5 2.7 3.61 4.12 4.73 5.94 5 6 7 8 9

0 1 2 3 4 5 6 7 8 9

1.5 2.7 3.6 4.1 4.7 5.9 5.9

9
Mecanismo de Inserção
Continua o deslocamento até chegar a posição
de inserção do 4,5 – posição 4
0 1 2 3 4 5 6 7 8
9
1.5 2.7 3.6 4.1 4.7 5.9 5.9

0 1 2 3 4 5 6 7 8 9

1.5 2.7 3.6 4.1 4.7 4.7 5.9

Posição de inserção do 4.5

10
Mecanismo de Inserção
Insere o 4.5

0 1 2 3 4 5 6 8 9
7
1.5 2.7 3.6 4.1 4.5 4.7 5.9

Atualiza a quantidade de elementos da lista (passa


a ser 7)
n++;

11
Busca Binária
 Consiste em fazer uma busca em um vetor já
ordenado 9
0 1 2 3 4 5 6 7
1.5 2.7 3.6
8 4.1 4.5 4.7 5.9

 Esta operação será implementada por uma função que retornará


o índice do elemento (sucesso na busca) ou -1 (fracasso na
busca).
 Protótipo:
void buscaBinaria(float v[], float valor,int n);

12
Mecanismo da Busca Binária
Supondo-se que deseja-se buscar o valor 4.7 no
vetor
0
1.5 2.7 1
3.6 2
4.1 3
4.5 4
4.7 5
5.9 6 7 8 9

Divide-se o espaço de busca ao meio e verifica-se,


comparando o valor de busca (no exemplo 4.7) com
o elemento do meio da lista.
Espaço de busca

0
1.5 2.7 1
3.6 2
4.1 3
4.5 4
4.7 5
5.9 6 7 8 9

meio 13
Mecanismo da Busca Binária
Espaço de busca
Comparações: 1a

0
1.5 1
2.7 2
3.6 3
4.1 4
4.5 5
4.7 6
5.9 7 8 9

1ª metade meio 2ª metade


 Se a chave de busca (valor procurado) é igual ao valor central do vetor (meio)
– a busca termina com sucesso
 Se a chave de busca (valor procurado) é menor que o valor central do vetor
(meio) – a busca continua na primeira metade do vetor
 Se a chave de busca (valor procurado) é maior que o valor central do
vetor (meio) – a busca continua na segunda metade do vetor
 No Exemplo, a busca continua na segunda metade do vetor.

14
Mecanismo da Busca Binária
4 5 6 4.7?
4.5 4.7 5.6
Comparações: 2a
meio

Espaço de busca
 Se a chave de busca (valor procurado) é igual ao valor central do vetor (meio) – a
busca termina com sucesso
 Se a chave de busca (valor procurado) é menor que o valor central do vetor (meio) –
a busca continua na primeira metade do vetor
 Se a chave de busca (valor procurado) é maior que o valor central do vetor (meio) –
a busca continua na segunda metade do vetor
 O processo se repete até que o elemento seja encontrado – a posição, onde o elemento foi
encontrado, é retornada
 Ou, até que o espaço de busca termine (busca acaba sem sucesso) – o valor -1 é retornado
(posição inválida) – indica que o valor procurado não foi encontrado.
 No Exemplo, a busca termina com sucesso e o valor 5 (posição do vetor onde o
elemento foi encontrado) é retornado como resposta pela função que realiza a busca
binária.
15
Busca Sequencial X Busca Binária
Supondo-se o
0 1 2 3 4 5 6 4.7?
vetor:
1.5 2.7 3.6 4.1 4.5 4.7 5.9

Na busca binária para localizar o 4.7 são realizadas


2 comparações
Na busca sequencial seriam 6 comparações
para localizar o valor 4.7

16
Busca Sequencial X Busca Binária
 Busca por um registro entre 1000
 Busca Binária
 complexidade: O(log n)
 pior caso: (maior inteiro imediatamente menor que (log n)) + 1
comparações = 10 comparações, ou seja, 10 acessos a disco.
 Busca Sequencial
 complexidade: O(n)
 pior caso: 1000
 em média: 500
 A busca binária é mais eficiente na maioria dos casos
(mais veloz)
 A busca sequencial tem a vantagem de poder ser aplicada a
qualquer vetor (no sentido de não haver obrigatoriedade
dos elementos do vetor vetor terem que estar
ordenados).
17
Remoção mantendo Ordem
Consiste em retirar um valor do vetor, mantendo a
ordem
existente e ajustando o total de elementos.
Só pode ocorrer, no entanto, se a lista não estiver vazia.
Caso ocorra a remoção, o total de elementos da lista
deve ser decrementado.
Protótipo:
void removerEmOrdem(float [], float , int &);

18
Mecanismo de Remoção
 Supondo a lista ordenada, onde n == 7 (existem 7
elementos): 9
0 1 2 3 4 5 6 7
1.5 2.7 3.68 4.1 4.5 4.7 5.9

 Deseja-se remover o valor 3.6


 Verifica-se se a lista está vazia, caso positivo, não pode retirar;
senão
 Realiza-se uma busca do valor 3.6 para se obter a posição onde o
3.6 está na lista (no exemplo, posição 2).
 Pode-se realizar a busca binária, já que o vetor está ordenado
 Deve-se verificar se o valor foi encontrado
 No exemplo seria encontrado o valor 2

19
Mecanismo de Remoção
Atualiza-se a quantidade de elementos da lista:
n--; (no exemplo n passa a ser 6)
A partir da posição seguinte do elemento a ser
removido, até o final, move-se os elementos
para posição anterior
0 1 2 3 4 5 6 7 8
9
1.5 2.7 3.6 4.1 4.5 4.7 5.9

0 1 2 3 4 5 6 7 8 9
1.5 2.7 4.1 4.1 4.5 4.7 5.9

20
Mecanismo de Remoção
0 1 2 3 4 5 6 7 8 9

1.5 2.7 4.1 4.1 4.5 4.7 5.9

0 1 2 3 4 5 6 7 8 9

1.5 2.7 4.1 4.5 4.5 4.7 5.9

21
Mecanismo de Remoção
0 1 2 3 4 5 6 7 8 9

1.5 2.7 4.1 4.5 4.5 4.7 5.9

0 1 2 3 4 5 6 7 8 9

1.5 2.7 4.1 4.5 4.7 4.7 5.9

22
Mecanismo de Remoção
0 1 2 3 4 5 6 7 8 9

1.5 2.7 4.1 4.5 4.7 4.7 5.9

0 1 2 3 4 5 6 7 8 9

1.5 2.7 4.1 4.5 4.7 5.9 5.9

N == 6

23
%d:",i);
scanf("%f",&vet[i]);
}
printf("\nDigite o valor que deseja buscar:");
scanf("%f", &x);
while (inicio <= fim)
{
meio = (inicio + fim)/2;
if(x == vet[meio]) //modificacao
{
printf("\nO valor esta na posicao: %d\n",
meio);
}
for(i = 0; i < 5; i++)
{
if(x == vet[i])
{
inicio = (fim + 1);
//essa condicao é para sair do while
printf("\nO valor esta na posicao:
%d\n", i);
}
else if(x < vet[i])
{
fim = meio-1;
else {
printf("\nTentou buscar de uma lista vazia");
// Se a lista nao exister preenchida exibe
mensagem informando lista vazia
}
getch();
return NULL;
}

/* função para excluir registros da lista*/


struct Registro* excluir(struct Registro *lista,
int valor) {

/* ponteiro para elemento anterior */


struct Registro *ant = NULL;

/* ponteiro para percorrer a lista */


aux = lista;

if(!lista_vazia(lista)) {
/* procura elemento na lista, guardando
anterior */
while(aux!= NULL && aux->valor != valor) {
ant = aux;
aux = aux->prox;
Atividade Avaliativa – AULA 3 Em dupla
1- Faça um programa que escreva uma busca sequencial de
tamanho 20 para armazenar valores inteiros. Seu
programa deve solicitar os valores de entrada e fazer a
buscar de um elemento.

Nota: 0,5.
Entregar: 21/08/2019.
Não é aceito em outra aula.

26

Você também pode gostar