• Nenhum resultado encontrado

D D D miiiJ D D D Comparações sucessivas são feitas entre o

elemento que se procura e o elemento no meio da seqüência não pesquisada.

Cada não-sucesso da busca reduz a seqüência pela metade, até que o elemento seja

encontrado ou a seqüência não possa mais ser dividida.

D miiiJ D

D

i

Meio da seqüência pesquisada

I FIGURA 8.31 Busca binária

22 passo - Dividir o conjunto ao meio:

2 19 25 35 38 47 77 78 158 178 214 215 329 487 500

i

3º passo - Efetuar a comparação para verificar se o elemento procurado é igual ao elemento central, que será chamado de meio:

x = meio

Se o resultado for verdadeiro, a busca deverá ser encerrada. Caso contrário, serão executados os passos seguintes. No caso do nosso exemplo:

3 2 9 = 78, a resposta é falso .

4º passo - Efetuar a comparação para verificar se o elemento procurado é maior ou menor do que o elemento central:

3 2 9 > = 78, a resposta é verdadeiro.

5!! passo - Proceder a uma nova divisão do conjunto que atenda à condição do 4.!.! passo, isto é, se x for maior que meio, será dividido o conjunto da direita, senão, o

conjunto da esquerda. No caso do exemplo, será utilizado o conjunto da direita.

158 178 214 215 329 487 500

i

Repetir os passos 4 e 5 até que o elemento seja encontrado.

329 487 500

' -

CAPITULO 8 - BUSCA E ORDENAÇAO

ExEMPLo 8.8: Busca b.inária (ou logarítmica).

1 . Algoritmo Exemp l o S . 8

2 . Var

3 . sequencia vetor de elementos

4 . x inteiro

5 . encontrou : logica

6 . inicial, meio, final : números inteiros

7 . Início

8 . encontrou f- . f .

9 . Ler (x)

1 0 . Enquanto (inicial <= final) Faça

1 1 . meio <- (inicial + final) I 2 1 2 . Se (x = sequencia [meio) ) 1 3 . encontrou <- . v . 1 4 . <fim da busca> 1 5 . Senão 1 6 . Se (x <= sequencia [meio] ) 1 7 . final �- meio - 1 1 8 . Senão 1 9 . inicial <- meio + 1 2 0 . Fim-se 2 1 . Fim-se 2 2 . Fim-Enquanto 2 3 . Fim. 1 39

elemento a ser procurado

estes serão os índices da seqüência

O algoritmo de busca binária (Exemplo 8.8) é, na verdade, bem simples. Consi­ derando uma seqüência qualquer, o índice do meio da seqüência é dado pela divisão por

2 da soma do primeiro com o último índice do conjunto que se deseja pesquisar (linha 1 1 ) - cuidado para garantir o resultado inteiro dessa divisão, uma vez que índices só podem ser números inteiros. Compara-se o elemento procurado ao elemento do meio da seqüência (linha 12) e, se forem iguais, a busca é encerrada (linha 14). Caso contrário, uma segunda comparação é realizada para determinar se o elemento procurado é maior ou menor que o elemento encontrado no meio (linha 16). Se o elemento é menor, signi­ fica que a segunda metade da seqüência pode ser ignorada para a próxima pesquisa, e

isso pode ser alcançado alterando-se o valor do último índice do conjunto que se deseja pesquisar para o valor inferior do meio (linha 17). Caso contrário, isto é, caso o elemen­

to seja maior que o elemento encontrado, então a primeira parte da seqüência pode ser ignorada, alterando-se o índice do início da busca para o valor imediatamente superior ao do meio (linha 19).

Isso será repetido até que o elemento seja encontrado ou até que a seqüência não possa mais ser dividida, o que ocorre, na prática, quando o índice do fim torna-se menor que o índice do início. Nesse caso, o elemento não se encontra na seqüência e retoma-se

Fluxograma: Início encontrou <-.f. X inicial <= final .V. meio <- (inicial + final)/2 .F. final � meio + 1 encontrou � .v . .V. final � meio - 1 Fim

L< EM BRE·sE: Para implementar estes algoritmos, as variáveis inicial e final de­

vem receber algum valor!

O programa em Java para o Exemplo 8.8 segue exatamente a mesma lógica. No começo do algoritmo, o índice do início do conjunto a ser pesquisado será o índice do primeiro elemento da seqüência e o índice do fim será o índice do último elemento da

CAPÍTULO 8 - BUSCA E ORDENAÇÃO 1 4 1

seqüência. Lembramos que o índice do primeiro elemento de um vetor, em Java, é O e, portanto, o último elemento terá índice igual à quantidade de elementos do vetor me­ nos um. Java: 1 . c1ass BuscaBinaria{ 2 . 3 . 4 . 5 . 6 . 7 . 8 . 9 . 1 0 . 1 1 . 12 . 1 3 . 14. 1 5 . 1 6 . }

public static boolean binaria ( int x, int numeros [ ) ) {

int inicio = O , fim = numeros . length-1;

}

int meio;

\'lhile ( inicio <= fim) {

}

meio = ( inicio + fim) I 2 ;

if ( x == numeros [meio) ) return true; if (x < numeros [meio) ) fim = meio - 1 ; e1se inicio = meio + 1 ; return fa1se;

Esse programa apresenta apenas a criação de um método para busca de números jnteiros. Seguindo-se as mesmas considerações de comparações dadas anteriormente, pode-se modificar ou ampliar essa classe para fazer pesquisa por meio do método de busca binária para outro tipo qualquer ou para strings.

8.3

Java.

, �

EXERCICIOS PARA FIXAÇAO

Para os problemas abaixo, faça o pseudocódigo, o fluxograma e o programa em

1 . Crie uma matriz com 20 números inteiros que deverão ser fornecidos aleato­ riamente pelo usuário e:

a) coloque os elementos na ordem crescente;

b) coloque os elementos na ordem decrescente.

2. Crie uma matriz com nomes e ordene-a.

3. Elabore uma matriz com as seguintes informações, que deverão ser forneci­ das pelo usuário: nome, sexo e idade, e:

a) ordene os elementos;

b) crie uma rotina para procurar um nome fornecido pelo usuário.

4. Reescreva o Exemplo 8.6 acrescentando outros métodos de busca linear para os demais tipos primitivos.

8 . 4

5. Reescreva o Exemplo 8.7 modificando o programa para que possua um menu de opções para entrada de dados (incluindo escolha de tipo), ordenação e busca.

6. Dada uma matriz A com N elementos do tipo real, elaborar um algoritmo que possibilite a busca binária de um valor qualquer fornecido pelo usuário.

7. Uma matriz X é composta pelos elementos do alfabeto e pelos numerais de O a 9. Escreva um algoritmo que seja capaz de localizar, pelo método binário, um caractere fornecido pelo usuário. Se esse caractere for uma letra o usuá­ rio poderá fornecê-la no formato maiúsculo ou minúsculo.

8. Dada uma tabela de horários de ônibus que fazem viagens para as diversas cidades do Estado de São Paulo, escreva um algoritmo que possibilite a l.oca­ lização dos horários de saída e de chegada quando se forneça o destino.

/

EXERCICIOS CO M P L E M E N TA R E S

1 . Elabore uma matriz que armazene dados de 30 funcionários de uma empre­ sa. Deverão ser considerados os campos: código funcional, nome, salário e data de admissão.

a) Preencha a matriz com dados fornecidos pelo usuário. b) Ordene os elementos pelo campo código funcional.

c) Crie uma rotina para encontrar os dados de um funcionário pelo método binário.

2. Elabore uma matriz com três linhas e 20 colunas, que deverá ser preenchida com elementos sorteados aleatoriamente (utilize o método random), e:

a) faça a busca, pelo método binário, de um elemento sorteado; b) faça a busca, pelo método seqüencial, de um elemento so1teado.

,

C A PIT UL O