前面有写过一篇“一个有序数组内查找某个数字(二分查找算法)”,里面有举例了几种实现方法,其中包括一种通过一个函数来实现的方法。最近学习到一些新的知识,在此补充下。也在原有代码基础上进行一些优化。
原函数实现二分查找的代码:
//头文件 #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函数外求出,传参到函数进行计算。