[Lenguaje C - Dicotomía] ¿Por qué necesitamos mid+1, mid-1 para encontrar el subíndice de un número en una matriz ordenada usando el método binario?

Primero pegue el código general:

#include<stdio.h>
int two_search(int arr[], int length, int k)
{
	int left = 0;
	int right = length - 1;

	while (left <= right)
	{
		int mid = (right + left) / 2;  //(0+9)/2=4
		if (k > arr[mid])
			left = mid+1;  //加1 减1 是必须的
		else if (k < arr[mid])
			right = mid-1;
		else 
			return mid;
	}
	return -1;
}

int main()
{
	int arr[] = {1,2,3,4,5,6,7,8,9,10};
	int k = 11; //想查找的数的下标

	int length = sizeof(arr) / sizeof(arr[0]);
	int ret = two_search(arr,length,k);
	if (ret != -1)
		printf("找到,%d在数组中的下标为%d", k, ret);
	else
		printf("未找到");
	return 0;
}

Pregunta: ¿Por qué el medio aquí suma 1?

while (left <= right)
	{
		int mid = (right + left) / 2;  //(0+9)/2=4
		if (k > arr[mid])
			left = mid+1;  //加1 减1 是必须的
		else if (k < arr[mid])
			right = mid-1;
		else 
			return mid;
	}

analizar:

Cuando mid no utiliza la operación de suma:

Por ejemplo, para encontrar 8 de 12345678910, el resultado es correcto:

Al buscar el 11, algo sale mal: 

Obviamente el resultado es que no se puede encontrar, pero el programa sigue ejecutándose y no puede salir.

razón:

La izquierda seguirá moviéndose hacia la derecha hasta que la izquierda = 8. En este momento, derecha = 9, mitad = (8+9)/2 = 8, por lo que la izquierda siempre es 8. Al mismo tiempo, observe la condición del cuerpo del bucle. Mientras que (izquierda <= derecha), la izquierda siempre es más pequeña que la derecha, por lo que el programa no puede salir del bucle, lo que provoca un bucle infinito. Como se muestra en la imagen:

 Cuando mid usa la operación agregar 1:

La izquierda seguirá moviéndose hacia la derecha hasta izquierda = 8. En este momento, derecha = 9, mitad = (8+9) = 8 se actualiza aún más, haciendo izquierda = mitad + 1 = 9, y luego hasta que la izquierda cruce a la derecha, haciendo while() no es verdadero, por lo que se sale del bucle.

 

 

Supongo que te gusta

Origin blog.csdn.net/ggbb_4/article/details/129126836
Recomendado
Clasificación