[RESOLVIDO] Duvida Busca binaria!

17 respostas
manolo

Pessoal, eu estou com uma difilculdade besta (mas bem chatinha), de indicar a posição em que um elemento (informado pelo usuário) se encontra no vetor.

segue abaixo o codigo:

import java.util.*;

public class Ex2Binario {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		int vet[];
		vet = new int[5];

		int elemento;

		Scanner input = new Scanner(System.in);

		for (int i = 0; i < vet.length; i++) {
			System.out.println(" Informe o elemento " + (i + 1)
					+ " para o array: ");
			vet[i] = input.nextInt();

		}

		System.out.println(" Informe um elemento para busca: ");
		elemento = input.nextInt();

		BuscaBinaria2.Binaria(elemento, vet);

		

	}

}
public class BuscaBinaria2 {

	public static void Binaria(int x, int dados[]) {
		
		int n = dados.length;
		int aux = 0;

		for (int i = 0; i < n - 1; i++) {
			for (int j = i + 1; j < n; j++) {
				if (dados[i] > dados[j]) {
					aux = dados[j];
					dados[j] = dados[i];
					dados[i] = aux;
				}
			}
		}

		int meio;
		int inicio = 0;
		int fim = dados.length - 1;
		while (inicio <= fim) {
			meio = (inicio + fim) / 2;
			if (x == dados[meio])
			    System.out.println(" O elemento informado esta na posiçao " + meio);
			else
				System.out.print(" O elemento informado nao foi achado ");
			
			if (x < dados[meio])
				fim = meio - 1;
			else
				inicio = meio + 1;
		}
		
		
	}

}

Obrigado...

17 Respostas

Frantic_Avenger

Fala aê Manolo,

Vê se é essa resposta que você quer:

public class BuscaBinaria2 {   
  
    public static void Binaria(int x, int dados[]) {   
           
        int n = dados.length;   
        int aux = 0;   
  
        for (int i = 0; i < n - 1; i++) {   
            for (int j = i + 1; j < n; j++) {   
                if (dados[i] > dados[j]) {   
                    aux = dados[j];   
                    dados[j] = dados[i];   
                    dados[i] = aux;   
                }   
            }   
        }   
  
        int meio;   
        int inicio = 0;   
        int fim = dados.length - 1;   
        while (inicio <= fim) {   
            meio = (inicio + fim) / 2;   
            if (x == dados[meio]){
                System.out.println(" O elemento informado esta na posiçao " + (meio+1));
                break;
            } else   
                System.out.print(" O elemento informado nao foi achado ");   
               
            if (x < dados[meio])   
                fim = meio - 1;   
            else   
                inicio = meio + 1;   
        }   
           
           
    }   
  
}

Flw

manolo

Olá Frantic!

Obrigado por estar sempre dando uma força.

Cara infelizmente da erro desta forma!
testei aqui e não funfa

Abrass :smiley:

Frantic_Avenger

Que tipo de erro está ocorrendo?

manolo

Ele não encontra a posição correta, e as vezes informa que o numero não foi achado!

Ta meio dificil de resolver, to quebrando a cabeça aqui!

Abraço

Frantic_Avenger

Se for porque imprimiu que o número não é encontrado, é porque ele não foi encontrado naquele loop.

Nisso você pode usar um boolean e com relação a posição, eu somei + 1 na variável meio para retornar o número "exato".

public class BuscaBinaria2 {   
  
    public static void Binaria(int x, int dados[]) {   
           
        int n = dados.length;   
        int aux = 0;   
  
        for (int i = 0; i < n - 1; i++) {   
            for (int j = i + 1; j < n; j++) {   
                if (dados[i] > dados[j]) {   
                    aux = dados[j];   
                    dados[j] = dados[i];   
                    dados[i] = aux;   
                }   
            }   
        }   
  
        int meio;   
        int inicio = 0;   
        int fim = dados.length - 1;
        boolean achou = false;
        while (inicio <= fim) {   
            meio = (inicio + fim) / 2;   
            if (x == dados[meio]){
                System.out.println(" O elemento informado esta na posiçao " + (meio+1));
                achou = true;
                break;
            } 
               
            if (x < dados[meio])   
                fim = meio - 1;   
            else   
                inicio = meio + 1;   
        }
        if (!achou)
        	System.out.print(" O elemento informado nao foi achado ");
           
           
    }   
  
}

Vê se isso resolve. Flw

manolo

Cara, infelizmente nada ainda!

Olha a saida!

Informe o elemento 1 para o array:
658
Informe o elemento 2 para o array:
958
Informe o elemento 3 para o array:
4
Informe o elemento 4 para o array:
2
Informe o elemento 5 para o array:
97
Informe um elemento para busca:
958
O elemento informado esta na posiçao 5

Frantic_Avenger

O resultado não seria esse devido a ordenação que você faz, ficando os maiores números por último?

Flw.

manolo

Cara acho que descobri!!!

E que estou informando os elementos desordenadamente!
E depois ele ordena, e mostra o resultado ordenado

manolo

Opa.
auauhauhauhauhahauhaha
isso mesmo!

  • vc descobriu!
Frantic_Avenger

Já tinha reparado isso antes só que pensei que você também tivesse percebido, eu testando aqui e sempre indo certo e você falando que tava errado. :lol:
Flw

manolo

Frantic uma ultima ajuda! :oops:

Como eu posso informar que o elemento se encontra no meio do array?

if (x < dados[meio]){
				fim = meio - 1;
				System.out.println(" O elemento esta na parte inferior do Array! ");
			}else{
				inicio = meio + 1;
				System.out.println(" O elemento esta na parte superior do Array! ");
			}
				
		}
		if(!acho)
			System.out.print(" o elemento nao foi achado");
Frantic_Avenger

Assim:

if (x < dados[meio]){   
        fim = meio - 1;   
        System.out.println(" O elemento esta na parte inferior do Array! ");
    } else if (x > dados[meio]){   
        inicio = meio + 1;   
        System.out.println(" O elemento esta na parte superior do Array! ");   
    } else if (x == dados[meio]){
		System.out.println(" O elemento esta no meio do Array! ");
	}
           
}   
if(!acho)   
    System.out.print(" o elemento nao foi achado");

Flw

manolo

Ixiii cara não funfo!

olha a saida!

Informe o elemento 1 para o array:
1
Informe o elemento 2 para o array:
2
Informe o elemento 3 para o array:
3
Informe o elemento 4 para o array:
4
Informe o elemento 5 para o array:
5
Informe um elemento para busca:
5
O elemento esta na parte superior do Array!
O elemento esta na parte superior do Array!
O elemento informado esta na posiçao 5
OBS: Lembrando que o vetor foi ordenado!

E quando tento acessar para aparecer o do meio, nenhuma mensagem e postada!

Obrigado

Frantic_Avenger

Deu certinho aqui (Obs.: esses if's são antes do break).

public class BuscaBinaria2 {   
  
    public static void Binaria(int x, int dados[]) {   
           
        int n = dados.length;   
        int aux = 0;   
  
        for (int i = 0; i < n - 1; i++) {   
            for (int j = i + 1; j < n; j++) {   
                if (dados[i] > dados[j]) {   
                    aux = dados[j];   
                    dados[j] = dados[i];   
                    dados[i] = aux;   
                }   
            }   
        }   
  
        int meio;   
        int inicio = 0;   
        int fim = dados.length - 1;
        boolean achou = false;
        while (inicio <= fim) {   
            meio = (inicio + fim) / 2;   
            if (x < dados[meio]){     
                fim = meio - 1;     
                System.out.println(" O elemento esta na parte inferior do Array! ");   
            } else if (x > dados[meio]){     
                inicio = meio + 1;     
                System.out.println(" O elemento esta na parte superior do Array! ");     
            } else if (x == dados[meio]){   
                System.out.println(" O elemento esta no meio do Array! ");
                System.out.println(" O elemento informado esta na posiçao " + (meio+1));
                achou = true;
                break;
            }
               
        }
        if (!achou)
        	System.out.print(" O elemento informado nao foi achado ");
           
           
    }   
  
}
Vingdel

Veja se isso funciona e cumpre com a proposta do porgrama, afinal não segui seu raciocínio...

public class BuscaBinaria2 {

	public static void Binaria(int x, int dados[]) {
		
		int n = dados.length;

		for(int i = 0; i < n; i++){
			if(x == dados[i]){
				System.out.println("O elemento informado eh o item: " + (i+1) + "\n\nO elemento informado esta no indice: " + (i));	
				break;
			}else if(i == n - 1){
				System.out.println("O elemento informado nao existe!!!");
			}
		}
	}
}

Qualquer coisa grita. Abraço!

Vingdel

Perdeu o interesse pela solução?

manolo

Nossa cara, na verdade está tao desesperador meu cotidiano que to sem tempo para nada.
Mas, minha duvida já foi sanada. Obrigadão pela ajuda

Abraço.

Criado 21 de junho de 2010
Ultima resposta 29 de jun. de 2010
Respostas 17
Participantes 3