前面有写过一篇“一个有序数组内查找某个数字(二分查找算法)”,里面有举例了几种实现方法,其中包括一种通过一个函数来实现的方法。最近学习到一些新的知识,在此补充下。也在原有代码基础上进行一些优化。
原函数实现二分查找的代码:
//头文件
#include <stdio.h>
//二分查找函数
int bin_search(int que_arr[], int left, int right, int que_num) //(查询数组, 左下标, 右下标, 查询数)
{
int mid = 0;
while (left <= right)
{
mid = (left + right) >> 1; //二进制右移1位,相当于数学上的除2运算,但相对除2运算速度更快
if (que_num < que_arr[mid])
{
right = mid - 1;
}
else if (que_num > que_arr[mid])
{
left = mid + 1;
}
else
{
return mid; //找到数字,返回下标
}
}
return -1; //未找到数字,返回-1
}
//主函数
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int search_num = 0;
int left_index = 0;
int right_index = (sizeof(arr) / sizeof(arr[0])) - 1;
int bin_num = 0; //二分查找变量,调用二分查询函数用
printf("请输入您要查询的数字:>");
scanf("%d", &search_num);
bin_num = bin_search(arr, left_index, right_index, search_num); //传递参数给二分查找函数
if (-1 == bin_num)
{
printf("抱歉,数组内没有您要查询的数字!\n");
}
else
{
printf("恭喜,找到了!您要查询的数字%d在数组内的下标为:>%d\n", search_num, bin_num);
}
return 0;
}如上代码,arr[]数组的左下标和右下标是在主函数内计算出来,传给二分查找函数bin_search。如果需要频繁调用bin_search函数时,那么每次都要计算数组的左下标和右下标。这样就会降低程序的效率。如果只是求出数组内元素的个数,传参给到函数内部去计算。当需要频繁调用bin_search函数时,就不需要在外面频繁的去计算数组的左下标和右下标。这样不但可以提升程序的效率,也可以省掉去编写那些不必要的代码。
优化后二分查找函数代码:
//头文件
#include <stdio.h>
//二分查找函数
int bin_search(int que_arr[], int AE, int que_num) //(查询数组, 数组元素数量, 查询数字)
{
int mid = 0;
int left = 0;
int right = AE - 1;
while (left <= right)
{
mid = (left + right) >> 1; //二进制右移1位,相当于数学上的除2运算,但相对除2运算速度更快
if (que_num < que_arr[mid])
{
right = mid - 1;
}
else if (que_num > que_arr[mid])
{
left = mid + 1;
}
else
{
return mid; //找到数字,返回下标
}
}
return -1; //未找到数字,返回-1
}
//主函数
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int search_num = 0; //要查询的数字
int AE_num = (sizeof(arr) / sizeof(arr[0])); //数组元素数量
int bin_num = 0; //二分查找变量,调用二分查询函数用
printf("请输入您要查询的数字:>");
scanf("%d", &search_num);
bin_num = bin_search(arr, AE_num, search_num); //传递参数给二分查找函数
if (-1 == bin_num)
{
printf("抱歉,数组内没有您要查询的数字!\n");
}
else
{
printf("恭喜,找到了!您要查询的数字%d在数组内的下标为:>%d\n", search_num, bin_num);
}
return 0;
}注意:数组在传参时,实际传过去的不是数组本身,仅仅是传过去了数组内首元素的地址。bin_search的形参que_arr[]实际是一个指针,指针是无法求出数组的元素个数。因此数组的元素个数是需要在bin_search函数外求出,传参到函数进行计算。