Para a busca binária funcionar, seu “Vetor” precisa ter os dados ordenados. Você está criando essa estrutura de dados com 10k elementos, inserindo 10 elementos e realizando a busca. Sua estrutura de dados tem no array numeros
(que não tenho ideia pq vc declarou como static
), após a inserção dos valores, algo como 5, 10, 15, 25, 30, 35, 40, 45, 50, 55, 0, 0, 0, 0, 0, ..., 0
. Qualquer busca pelos valores inseridos não encontrará nada, porque a posição do meio vai conter um zero, o valor buscado é maior que zero, a recursão vai para a direita, só encontrando zeros. Se você instanciar sua estrutura com a capacidade 10, seu algoritmo vai funcionar.
Aproveitando, você tem alguns problemas conceituais no seu código. Não sei exatamente o que seu professor pediu ou se ele está errando algo… A gente vê cada barbaridade hoje em dia que nada mais me espanta. A capacidade é o quanto a estrutura comporta, não necessariamente onde existem dados. Dê uma olhada aqui, é uma implementação com “redimensionamento” de array de uma estrutura de dados do tipo lista: https://github.com/davidbuzatto/AlgoritmosEstruturasDeDados/blob/master/src/aesd/esdc4/ds/implementations/linear/ResizingArrayList.java
Uma implementação de capacidade fixa para sua ESD seria algo assim:
import java.util.Arrays;
/**
*
* @author David
*/
public class Vetor {
private int[] numeros;
private int tamanho;
public Vetor( int capacidade ) {
this.numeros = new int[capacidade];
}
public void inserir( int posicao, int elemento ) throws IllegalStateException {
if ( posicao < 0 || posicao > tamanho ) {
throw new IllegalArgumentException(
String.format( "a posição precisa estar entre 0 e %d, mas é %d",
tamanho, posicao ) );
}
if ( tamanho < numeros.length ) {
// realoca os valores (faz a lista andar para a direita)
for ( int i = tamanho - 1; i >= posicao; i-- ) {
numeros[i+1] = numeros[i];
}
numeros[posicao] = elemento;
tamanho++;
} else {
throw new IllegalStateException( "O Vetor está cheio!" );
}
}
public boolean estaVazio() {
return tamanho == 0;
}
public int apagar( int posicao ) throws IllegalStateException, IllegalArgumentException {
if ( estaVazio()) {
throw new IllegalStateException( "O Vetor está vazio!" );
}
if ( posicao < 0 || posicao > tamanho - 1 ) {
throw new IllegalArgumentException(
String.format( "a posição precisa estar entre 0 e %d, mas é %d",
tamanho - 1, posicao ) );
}
int valor = numeros[posicao];
tamanho--;
// realoca os valores (faz a lista andar para a esquerda)
for ( int i = posicao; i <= tamanho; i++ ) {
numeros[i] = numeros[i+1];
}
return valor;
}
public int tamanho() {
return tamanho;
}
public int maior() throws IllegalStateException {
if ( !estaVazio() ) {
int maior = numeros[0];
for ( int i = 1; i < tamanho; i++ ) {
if ( maior < numeros[i] ) {
maior = numeros[i];
}
}
return maior;
}
throw new IllegalStateException( "Vetor vazio" );
}
public int menor() throws IllegalStateException {
if ( !estaVazio() ) {
int menor = numeros[0];
for ( int i = 1; i < tamanho; i++ ) {
if ( menor > numeros[i] ) {
menor = numeros[i];
}
}
return menor;
}
throw new IllegalStateException( "Vetor vazio" );
}
public int buscaBinariaRecursiva( int elemento ) {
return buscaRecursiva( elemento, 0, tamanho - 1 );
}
public int buscaRecursiva( int elemento, int menor, int maior ) {
int media = ( menor + maior ) / 2;
if ( menor <= maior ) {
if ( numeros[media] == elemento ) {
return media;
} else if ( numeros[media] < elemento ) {
return buscaRecursiva( elemento, media + 1, maior );
} else {
return buscaRecursiva( elemento, menor, media - 1 );
}
}
return -1;
}
public void ordenar() {
Arrays.sort( numeros, 0, tamanho );
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
if ( !estaVazio() ) {
// percorrendo o array de valores
for ( int i = 0; i <= tamanho - 1; i++ ) {
sb.append( String.format( "[%d] - ", i ) )
.append( numeros[i] );
if ( tamanho == 1 ) {
sb.append( " <- início/fim\n" );
} else if ( i == 0 ) {
sb.append( " <- início\n" );
} else if ( i == tamanho - 1 ) {
sb.append( " <- fim\n" );
} else {
sb.append( "\n" );
}
}
} else {
sb.append( "Vetor vazio!\n" );
}
return sb.toString();
}
public static void main( String[] args ) {
Vetor vetor = new Vetor(100);
System.out.println( vetor );
vetor.inserir(0, 5);
System.out.println( vetor );
vetor.inserir(1, 10);
System.out.println( vetor );
vetor.inserir(2, 15);
System.out.println( vetor );
vetor.inserir(3, 25);
System.out.println( vetor );
vetor.inserir(4, 30);
System.out.println( vetor );
vetor.inserir(5, 35);
System.out.println( vetor );
vetor.inserir(6, 40);
System.out.println( vetor );
vetor.inserir(7, 45);
System.out.println( vetor );
vetor.inserir(8, 50);
System.out.println( vetor );
vetor.inserir(9, 55);
System.out.println( vetor );
vetor.inserir(10, 100);
System.out.println( vetor );
vetor.inserir(5, 31);
System.out.println( vetor );
vetor.inserir( 0, 500 );
System.out.println( vetor );
// precisa ordenar antes de executar a busca binária
vetor.ordenar();
System.out.println( vetor );
int resultado = vetor.buscaBinariaRecursiva( 55 );
if ( resultado < 0 ) {
System.out.println( "Número não encontrado!" );
} else {
System.out.println( "Número encontrado na posição: " + resultado );
}
System.out.println( "\nRemovendo elementos: " );
System.out.println( "Elemento removido: " + vetor.apagar( 5 ) );
System.out.println( vetor );
System.out.println( "Elemento removido: " + vetor.apagar( 0 ) );
System.out.println( vetor );
System.out.println( "Elemento removido: " + vetor.apagar( vetor.tamanho - 1 ) );
System.out.println( vetor );
while ( !vetor.estaVazio() ) {
System.out.println( "Elemento removido: " + vetor.apagar( 0 ) );
System.out.println( vetor );
}
}
}