【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;

 


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

目录
相关文章
|
7月前
|
C语言
【C语言刷题系列】合并两个有序数组
【C语言刷题系列】合并两个有序数组
|
3月前
|
存储 算法 C语言
【C语言】二分查找算法
【C语言】二分查找算法
|
7月前
|
存储 算法 C语言
二分查找算法的概念、原理、效率以及使用C语言循环和数组的简单实现
二分查找算法的概念、原理、效率以及使用C语言循环和数组的简单实现
|
7月前
|
C语言
C语言----数组----二分查找
C语言----数组----二分查找
|
7月前
|
C语言
C语言--通过函数实现二分查找
C语言--通过函数实现二分查找
|
8月前
|
程序员 C语言
【C语言】函数----函数的分类、库函数详解(strcpy、memset)、自定义函数的实现(找较大值、交换两个数)
【C语言】函数----函数的分类、库函数详解(strcpy、memset)、自定义函数的实现(找较大值、交换两个数)
54 0
|
8月前
|
C语言 数据安全/隐私保护
【C语言】分支和循环的应用(二分查找、字符移动、模拟登录界面)
【C语言】分支和循环的应用(二分查找、字符移动、模拟登录界面)
55 0
|
8月前
|
存储 搜索推荐 C语言
Leetcode—合并两个有序数组—C语言
Leetcode—合并两个有序数组—C语言
|
8月前
|
算法 C语言
【C语言】二分查找
【C语言】二分查找
|
8月前
|
C语言
C语言——二分查找(在万千之中快速找到你)
C语言——二分查找(在万千之中快速找到你)
51 0