/*
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
*/
package ia;
/**
*Jueves 20 de agosto del 2022.
* Ejemplo del algoritmo de busquea binaria.
* @author Rafael Angel MF
* Numero de celular en Costa Rica:
* 506 83942235
*/
public class AlgoritmoBusquedaBinaria {
private int numeroTemp=0;
private int aleatorio(int Min, int Max) {
if (Min == 0) {
Min = -1;
}
int resultado = (int) (Math.random() * (Max - Min + 1) + Min);
if (numeroTemp == resultado) {
// System.out.println("En aleatorio(), mismo resultado que el anterior:" + resultado);
aleatorio(Min, Max);
}
if(Min==0 && resultado==-1){
resultado=0;
}
numeroTemp = resultado;
// System.out.println("En aleatorio(), resultado " + resultado);
return resultado;
}
private double []matrizGlobal=new double[10];
public AlgoritmoBusquedaBinaria(){
for(int i=0; i<matrizGlobal.length; ++i){
matrizGlobal[i]=i+1;
}
}
@Override
public String toString(){
double valor=aleatorio(1,9);
return "Ejemplo de busqueda con el valor "+valor+" en Buscar2() \nid=" + this.Buscar2(matrizGlobal, valor) +
"\nEjemplo de busqueda con el valor 5 en Buscar() \nid=" + this.Buscar(matrizGlobal, 5);
}
/**
* En el do se podria usar esta condicion while(matriz[mitad]!=valor && (superior>0) && (inferior<matriz.length-1) );
* Pero resulta que causa que el algoritmo se detenga antes de tiempo.
* Sin embargo es preferible usar este condicional para el do while.
* Se podria usar esta otra condicion:
* while(matriz[mitad]!=valor || (superior>0) && (inferior<matriz.length-1) ); pero
* causa que el algoritmo no se detenga nunca.
* @param matriz Una matriz con valores dobles.
* @param valor Un numero doble
* @return Retorna el id donde esta el valor buscado.
*/
private int Buscar(double []matriz, double valor){
int mitad=0;
int inferior=0; int superior=matriz.length-1;
do{
try{
mitad=(inferior+superior)/2;
System.out.println("Comparando: Valor=" + valor+" > matriz[" + mitad+ "]=" + matriz[mitad]);
if(valor>matriz[mitad]){
inferior+=mitad;
}else if(valor<matriz[mitad]){
superior-=mitad;
}
if(matriz[mitad]==valor){
return mitad;
}
}catch(Exception e){
return -1;
}
}while(matriz[mitad]!=valor && (superior>0) && (inferior<matriz.length-1) );
return -1;
}
/**
* Algoritmo cortesia de mi parte Rafael Angel Montero Fernpandez.
* Esta basado en el original Buscar... pero con algunas diferencias.
* @param matriz Una matriz con numeros.
* @param valor Un numero.
* @return Retorna el id de la posicion del valor en la matriz.
*/
private int Buscar2(double []matriz, double valor){
int mitad=(matriz.length-1)/2;
int inferior=0; int superior=matriz.length-1;
do{
if(matriz[mitad]<valor){
if(matriz[inferior]==valor){
return inferior;
}
inferior++;
}
else if(matriz[mitad]>valor){
if(matriz[superior]==valor){
return superior;
}
superior--;
}
else if(matriz[mitad]==valor){
return mitad;
}
}while(matriz[mitad]!=valor && (superior>0) && (inferior<matriz.length-1) );
return -1;
}
public static void main(String []m){
AlgoritmoBusquedaBinaria b=new AlgoritmoBusquedaBinaria();
System.out.println(b.toString());
}
}