一、前言
在一个有序排列的数组中,想要查找到特定数字(k),通常最容易想到的是一个个数组元素查找,但这种方法只适合于数组元素少,特定数字位置比较靠前的数组。如果有大量的数字等待查找,就要寻找更为快速的方法了。下面详细介绍一种C语言常见的查找方法--二分查找。
二、实现思路
三、实现代码
mian主函数内实现:
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
int k = 7;//要查找的数字
int left = 0;//数组最左边起始位置下标
int right = sz - 1;//数组长度-1=最右边位置下标
int mid = 0;//相加得到的中间元素下标
while (left<=right)
{
mid = (left + right) / 2;
if (arr[mid] < k)
{
left = mid + 1;
}
else if(arr[mid] > k)
{
right = mid - 1;
}
else
{
printf("找到了,下标为:%d\n", mid);
break;
}
}
if (left > right)
{
printf("找不到了\n");
}
}
自定义binary_search函数实现:(注意:函数名要见名知意)
int binary_search(int arr[], int sz, int k)
{
int left = 0;
int right = sz - 1;
int mid = 0;
while (left <= right)
{
mid = (left + right) / 2;
if (arr[mid] < k)
{
left = mid + 1;
}
else if (arr[mid] > k)
{
right = mid - 1;
}
else
{
return mid;
}
}
return -1;
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
int k = 7;
int ret = binary_search(arr, sz, k);
if (ret == -1)
{
printf("找不到\n");
}
else
{
printf("找到了,下标为%d", ret);
}
return 0;
}
代码分析:
运行结果:
四、错误代码示范
int binary_search(int arr[], int k)
{
int left = 0;
//错误代码:
int sz = sizeof(arr) / sizeof(arr[0]);//1
int right = sz - 1;
int mid = 0;
while (left <= right)
{
mid = (left + right) / 2;
if (arr[mid] < k)
{
left = mid + 1;
}
else if (arr[mid] > k)
{
right = mid - 1;
}
else
{
return mid;
}
}
return -1;
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 7;
int ret = binary_search(arr, k);
if (ret == -1)
{
printf("找不到\n");
}
else
{
printf("找到了,下标为%d", ret);
}
return 0;
}
代码分析:
思考:为什么参数传递的是int arr[]或者int* arr而不是int arr[10]?
结论:
五、封装函数和导入静态库(了解)
步骤:
应用场景: