Linha | Codigo |
001 | // Prof. Leo^nidas - http://www.matematica.br http://line.ime.usp.br |
002 | // MAC0122 - 2017/08/16 |
003 | // |
004 | // Descricao: funcao "buscaBinaria(int vet[], int e, int d, int x)" |
005 | // 1. Devolve i se x ocorre entre as posicoes e e d, -1 em caso contrario |
006 | // 2. Dados programa principal que |
007 | // * entrada dados: dados no codigo, pois tem que estar ordenado! |
008 | // * buscas: usando a funcao de 1, o usuario devera digitar um valor, se negativo pare (e nada imprime), senao |
009 | // verifique se valor no vetor (imprimindo sua posicao ou -1 se nao estiver no vetor) |
010 | // o programa para quando usuario digitar um valor negativo (neste caso o programa deve imprimir NADA). |
011 | |
012 | #include <stdio.h> |
013 | |
014 | #define MAX 50 |
015 | |
016 | // Ideia: pega elemento do meio, se menor que x busca na metade direita, se maior, busca na metade esquerda |
017 | // Complexidade: O(log n) pois a cada passo elimina metade dos elementos |
018 | // Param: 'vet[]' vetor com dados, 'int e' indice esquerdo, 'int d' indice direito, 'int x' elemento buscado |
019 | // Devolve: j entre e e d se encontrou na posicao j; -1 se x nao pertence a 'vet[e..d]' |
020 | int buscaBinaria (int vet[], int e, int d, int x) { |
021 | int m; |
022 | while (e <= d) { // invariante: 'x' NAO pertence a 'vet[0..e-1]' e nem a 'vet[d+1..n-1]' |
023 | m = (e + d) / 2; // media (lembre-se: divisao inteira) |
024 | if (vet[m]<x) // metade esquerda NAO contem x |
025 | e = m+1; |
026 | else |
027 | if (vet[m]>x) // metade direita NAO contem x |
028 | d = m-1; |
029 | else |
030 | return m; // encontrou! |
031 | } |
032 | return -1; |
033 | } |
034 | |
035 | int main (void) { |
036 | int n = 9, vet[] = { 0, 2, 2, 3, 5, 6, 7, 7, 9 }; // tem que estar ordenado... |
037 | int i, x = 0; |
038 | // entrada de dados: tem que estar ordenado! |
039 | //D scanf("%d", &n); for (i=0; i<n; i++) scanf("%d", &vet[i]); |
040 | for (i=0; i<n; i++) printf("%d ", vet[i]); |
041 | printf("\nBuscas...\n"); |
042 | // buscar elementos (digitar negativo finaliza programa) |
043 | x = 0; |
044 | while (x>=0) { |
045 | scanf("%d", &x); |
046 | if (x>=0) { |
047 | i = buscaBinaria(vet, 0, n, x); |
048 | if (i>=0) |
049 | printf("* achei %d em vet[%d]\n", x, i); |
050 | else |
051 | printf("* %d nao esta no vetor!\n", x); // NAO encontrado |
052 | } |
053 | } |
054 | return 0; |
055 | } |