Problema com busca binária recursiva em Java

Trata-se de um exercício da disciplina de Estrutura de Dados. Preciso criar um método para uma classe Vetor que possibilite uma busca binária recursiva, a partir de um número lido no teclado. O código está dividido em duas classes. Outros métodos foram adicionados como parte de exercícios anteriores. O problema está na Busca Recursiva, que sempre retorna 0. Alguém poderia me ajudar a encontrar o problema?

// Classe Vetor //

public class Vetor {

public static int[] numeros;
public int posicao;
public int ocupados = 0;
public int elemento = 0;

public Vetor(int capacidade) {
	this.numeros = new int[capacidade];
}

public void insere(int posicao, int elemento) {
	numeros[posicao] = elemento;
	ocupados++;
}

public void apaga(int posicao) {
	numeros[posicao] = 0;
	ocupados--;
}

public int tamanho() {
	return numeros.length;
}

public int ocupados() {
	return this.ocupados;
}

public int maior() {
	int maior = 0;
	int i = 0;
	for (i=0; i<numeros.length; i++) {
		if (maior < numeros[i]) {
			maior = numeros[i];
		}
	}
	return maior;
}

public int menor() {
	int menor = Integer.MAX_VALUE;
	int i = 0;
	for (i=0; i<numeros.length; i++) {
		if (numeros[i] < menor) {
			menor = numeros[i];
		}
	}
	return menor;
}


public int buscaBinariaRecursiva(int elemento) {
	return buscaRecursiva(elemento, 0, numeros.length - 1);
}

public int buscaRecursiva(int elemento, int menor, int maior) {
	int media = (menor + maior) / 2;
	if (menor > maior) {
		return -1;
	}
	if(numeros[media] == elemento) {
		return media;
	}
	if(numeros[media] < elemento) {
		return buscaRecursiva(elemento, media +1, maior);
	}
	else {
		return buscaRecursiva(elemento, menor, media - 1);
	}
	
}

}

/// Classe ExerciciosVetor (com método main()) //

import java.util.Scanner;

public class ExerciciosVetor {

public static void main(String[] args) {
	
	Vetor vetor = new Vetor(10000);
	vetor.insere(0, 5);
	vetor.insere(1, 10);
	vetor.insere(2, 15);
	vetor.insere(3, 25);
	vetor.insere(4, 30);
	vetor.insere(5, 35);
	vetor.insere(6, 40);
	vetor.insere(7, 45);
	vetor.insere(8, 50);
	vetor.insere(9, 55);
	
	
	//System.out.println(vetor.tamanho());
	//System.out.println(vetor.ocupados());
	//System.out.println(vetor.maior());
	//System.out.println(vetor.menor());
	
	Scanner teclado = new Scanner(System.in);
	System.out.println("Digite o número que deseja procurar: ");
	int elemento = teclado.nextInt();
	int resultado = vetor.buscaBinariaRecursiva(elemento);
	if (resultado < 0) {
		System.out.println("Número não encontrado!");
	}
	else {
		System.out.println("Número encontrado na posição: " + resultado);
	}
	
}

}

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

    }

}
1 curtida

Muito obrigado pela ajuda!

1 curtida