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.