【C语言】自定义函数对有序数组的二分查找,以及对二分查找会出现的问题进行补充

简介: 【C语言】自定义函数对有序数组的二分查找,以及对二分查找会出现的问题进行补充

一、编写main函数

int main()
{
  int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
  int k = 0;
  scanf("%d", &k);
  int sz = sizeof(arr) / sizeof(arr[0]);
  int ret = binary_search(arr, k, sz); //自定义函数
  if (ret == -1)
  {
    printf("找不到\n");
  }
  else
  {
    printf("找到了,下标为:%d\n", ret);
  }
  return 0;
}

需要注意的是, 由于数组传输的是首地址,因此需要在main主调函数中提前计算出数组的大小(即sz)并传入binary_search函数。

不直接判断ret == 0而是ret == -1是因为可能要查找的值的下标就为0,因此-1更加合适。

二、binary_search函数的编写

int binary_search(int arr[], int k, int sz)
{
  int left = 0;
  int right = sz - 1;
  while (left <= right)
  {
    int mid = (left + right) / 2;
    if (arr[mid] > k)
      right = mid - 1;
    else if (arr[mid] < k)
      left = mid + 1;
    else
    {
      return mid;
    }
  }
  return -1;
}

对应的设置好left和right的范围。其中需要注意的是int mid = (left + right) / 2;必须放在循环内部,放在循环外mid就无法实时更新。

 


三、二分查找会出现的问题的补充说明

  int mid = (left + right) / 2;取平均值的方法,有时候是不靠谱的,因为当left和right非常大时,它们相加将会超出int能承受的最大值,就会造成溢出。当发生溢出时它们相加再相除的值便不再是它们俩的平均值。

 当然千万不能简单的觉得既然int溢出了,那用longlong就好了,那要是longlong也溢出了该怎么办,很显然这种处理方式是不对的。

而有一种方式是,假设一个柱子a高度是a,柱子b高度是b,如果希望柱子高度能一样高,可以将柱子b高出的部分分配一半给柱子a,便能够达到平分的操作。

因此在求平均值时,可以用这种方法从而避免溢出。即int mid = left + (right - left) / 2;

 


如果觉得作者写的不错,求给作者一个大大的点赞支持一下,你们的支持是我更新的最大动力!

目录
相关文章
|
2月前
|
算法 程序员 数据处理
算法与人生 揭秘C语言中高效搜索的秘诀——二分查找算法详解
算法与人生 揭秘C语言中高效搜索的秘诀——二分查找算法详解
|
2月前
|
存储 算法 搜索推荐
C语言与人生:数组交换和二分查找
C语言与人生:数组交换和二分查找
|
14天前
|
算法 C语言
【C语言必刷题】3.二分查找
【C语言必刷题】3.二分查找
|
1月前
|
编译器 程序员 C语言
【C语言】变长数组,二分查找和数组之间自动替换的实现
【C语言】变长数组,二分查找和数组之间自动替换的实现
|
1月前
|
存储 C语言
【C语言】Leetcode 88.合并两个有序数组
【C语言】Leetcode 88.合并两个有序数组
16 3
|
2月前
|
算法 C语言
C语言之二分查找
C语言之二分查找
|
2月前
|
C语言
二分查找法的区间判断【C语言】
二分查找法的区间判断【C语言】
|
4月前
|
算法 C语言
C语言——二分查找
C语言——二分查找
18 0
|
4月前
|
C语言
初识C语言之二分查找
初识C语言之二分查找
18 0
|
4月前
|
存储 算法 搜索推荐