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 );
}
}
}