Algoritmo de búsqueda --- búsqueda binaria (método recursivo)

Búsqueda binaria

Prerrequisitos

Nuestra búsqueda binaria debe realizarse en una matriz ordenada.

Ya sea de pequeño a grande o de grande a pequeño

tema

Realice una búsqueda binaria {1, 8,10,89,1000,1234} en una matriz ordenada , ingrese un número para
ver si la matriz está en este número y proporcione el subíndice; de ​​lo contrario, le indicará que hay no hay tal cantidad".

Ideas

Usaremos el pensamiento recursivo en nuestra búsqueda binaria esta vez. Por supuesto, también hay métodos no recursivos. Aprenderé por separado.

1. Primero determine el subíndice del medio de la matriz mid mid = (izquierda + derecha) / 2

2. Compare findValue con nuestro arr [mid]

Si findValue> arr [mid], búscalo de forma recursiva a la derecha

Si findValue <arr [mid], busque de forma recursiva a la izquierda

Si lo encuentra, regrese

¿Cuál es nuestra salida recursiva (condición final)?

1. Lo encontré, regrese y salga

2. Cuando se recupera toda la matriz, no se encuentra findValue, y necesitamos finalizar la recursividad, cuando nuestra izquierda> derecha significa que ha terminado.

Código

//二分查找
//@author 王
public class BinarySearch {
    
    

	public static void main(String[] args) {
    
    
		// TODO Auto-generated method stub
		int arr[] = {
    
    1,8,10,89,1000,1234};//必须是有序数组
		int resultIndex = binarySearch(arr, 0, arr.length -1, 1234);
		System.out.println(resultIndex);
	}
	/**
	 * 
	 * @param arr			数组
	 * @param left			左边索引
	 * @param right			右边索引
	 * @param findValue		需要找的数字,找到返回下标,未找到返回-1
	 * @return
	 */
	//二分查找算法
	public static int binarySearch(int[] arr,int left,int right,int findValue) {
    
    
		int mid = (left+right)/2;
		int midValue = arr[mid];
		
		if(findValue >midValue){
    
    
			//向右递归
			return binarySearch(arr, mid+1, right, findValue);
		}else if(findValue < midValue){
    
    
			//向左递归
			return binarySearch(arr, left, mid-1, findValue);
		}else{
    
    
			return mid;
		}
	}

}

Es fácil para nosotros encontrar el problema. Hay un problema con nuestra recursividad. Si encontramos un rescate de datos inexistente, se informará un error. Este error es causado por una recursión muerta.

Exception in thread "main" java.lang.StackOverflowError
	at 查找算法.BinarySearch.binarySearch(BinarySearch.java:27)

Entonces tenemos que escribir esta salida final recursiva

Mejorar

//二分查找
//@author 王
public class BinarySearch {
    
    

	public static void main(String[] args) {
    
    
		// TODO Auto-generated method stub
		int arr[] = {
    
    1,8,10,89,1000,1234};//必须是有序数组
		int resultIndex = binarySearch(arr, 0, arr.length -1, 123);
		if(resultIndex != -1){
    
    
			System.out.println(resultIndex);
		}else{
    
    
			System.out.println("没有找到这个数字");
		}
	}
	/**
	 * 
	 * @param arr			数组
	 * @param left			左边索引
	 * @param right			右边索引
	 * @param findValue		需要找的数字,找到返回下标,未找到返回-1
	 * @return
	 */
	//二分查找算法
	public static int binarySearch(int[] arr,int left,int right,int findValue) {
    
    
		if(left > right){
    
    
			return -1;
		}
		int mid = (left+right)/2;
		int midValue = arr[mid];
		if(findValue >midValue){
    
    
			//向右递归
			return binarySearch(arr, mid+1, right, findValue);
		}else if(findValue < midValue){
    
    
			//向左递归
			return binarySearch(arr, left, mid-1, findValue);
		}else{
    
    
			return mid;
		}
	}

}

Ampliémoslo un poco, que también es el ejercicio
extracurricular del profesor {1,8,10,89,1000,1000,1000,1234} Cuando hay varios valores idénticos en una matriz ordenada, cómo encontrar todos los valores A, por ejemplo, 1000 aquí.

La idea es similar a lo que aprendí la última vez, podemos usar una colección para almacenar nuestro valor de índice y regresar a nuestra colección.

Código

public class BinarySearch {
    
    

	public static void main(String[] args) {
    
    
		// TODO Auto-generated method stub
		int arr[] = {
    
    1,8,10,89,1000,1000,1000,1234};//必须是有序数组
		ArrayList<Integer> resultIndex = binarySearch2(arr, 0, arr.length -1, 1000);
		if(resultIndex.size() == 0){
    
    
			System.out.println("没有找到这个数字");
		}else{
    
    
			System.out.println(resultIndex);
		}
	}
    public static ArrayList<Integer> binarySearch2(int[] arr,int left,int right,int findValue) {
    
    
			if(left > right){
    
    
				return new ArrayList<Integer>();
			}
			int mid = (left+right)/2;
			int midValue = arr[mid];
			if(findValue >midValue){
    
    
				//向右递归
				return binarySearch2(arr, mid+1, right, findValue);
			}else if(findValue < midValue){
    
    
				//向左递归
				return binarySearch2(arr, left, mid-1, findValue);
			}else{
    
    
				ArrayList<Integer> list = new ArrayList<Integer>();
				int temp = mid -1;
				//向左边扫描
				while(true){
    
    
					if(temp < 0 || arr[temp] != findValue){
    
    
						//退出
						break;
					}else{
    
    
						//否则就将temp放到集合中
						list.add(temp);
						temp -= 1;//temp左移
					}
				}
				list.add(mid);
				//向右扫描
				temp = mid +1;
				while(true){
    
    
					if(temp > arr.length - 1 || arr[temp] != findValue){
    
    
						//退出
						break;
					}else{
    
    
						//否则就将temp放到集合中
						list.add(temp);
						temp += 1;//temp左移
					}
				}
				return list;
			}
		}
}

Supongo que te gusta

Origin blog.csdn.net/qq_22155255/article/details/112847063
Recomendado
Clasificación