×

C语言 C语言学习随笔 初始C语言 二分查找 折半查找

C语言学习随笔:函数内实现的“整型有序数组二分查找”的一些改进

一哥 一哥 发表于2022-11-21 20:58:09 浏览4542 评论0

抢沙发发表评论

前面有写过一篇“一个有序数组内查找某个数字(二分查找算法)”,里面有举例了几种实现方法,其中包括一种通过一个函数来实现的方法。最近学习到一些新的知识,在此补充下。也在原有代码基础上进行一些优化。


原函数实现二分查找的代码:

//头文件
#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函数外求出,传参到函数进行计算。

少长咸集

群贤毕至

访客