题目要求 :
在一个升序数组中查找指定的数值,找到了就返回下标,找不到就返回 -1
解题思路:
假设目前有一个升序数组arr[10] = {1,2,3,4,5,6,7,8,9,10}
数组下标及对应数值如图所示:
那么,假设我们要在这个数组中使用二分查找法来寻找到 7 这个数字
1、先确认数组大小
2、计算最左和最右边数组除以2的下标值(n要减1),将值存放至变量 mid;
3、 我们知道了数组的中间值,便可以开始第一次查找,若arr[mid] == key(key为要找到的数),则可以直接返回mid。
4、如上图所示,mid的值为index 4,要查找到的数7位于index 6,那么我们便可以舍弃掉左半边的值。
5、 经过第一次查找,并没有找到数字7所在位置,那么我们将 mid+1 赋值给 left(左数组坐标位置) left =5,重新计算mid的值, mid = (5+9)/2 = 7 开始新一轮二分查找。
6、若arr[mid] 的值超过key,那么key的值只能在左半部分,我们便可以将mid-1,把值赋给right,重新计算mid的值 mid = (5+6)/2 = 5
7、重复以上步骤,mid = (6+6)/2 = 6 == key所在位置的值,成功找到key。
代码部分:
#include<stdio.h>
int bin_search(int arr[], int left, int right, int key);
// arr 是查找的数组
//left 数组的左下标
//right 数组的右下标
//key 要查找的数字
int bin_search(int arr[], int left, int right, int key) {
int mid ;
while (left<=right) //边界条件
{
mid = (left + right) / 2;
if (arr[mid]==key)
{
return mid;
}
else if (arr[mid]<key)
{
left = mid + 1;
}
else {
right = mid - 1;
}
}
return -1; //若没找到,返回-1
}
int main() {
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int key;
int n = sizeof(arr) / sizeof(arr[0]);
scanf_s("%d", &key);//输入用户想查找的数
int result = bin_search(arr,0,n-1,key);
if (result != -1)
{
printf("你要找的数%d在数组坐标%d中", key, result);
}
else {
printf("没找到");
}
}