详解用二分法查找有序数据中的指定数字

简介: 详解用二分法查找有序数据中的指定数字

1. 什么是二分法?

二分法是C语言中一种常用的查找指定数据的算法思想,使用二分法的前提是一组数据必须是有序的(升序或降序)

2. 二分法的使用

(1)二分法的核心思想是用数组中(假设是一维数组)的中间元素和要查找的数字进行比较,每次比较都可以去掉一半的数据筛选的效率非常高。

其中要注意的地方是如何求中间元素的下标,我们通常定义两个变量left和right,left表示数组ky最左端的元素下标,right表示数组最右端的元素下标,那么中间元素的下标为mid=(left+right)/2,为了避免数据溢出,我们计算中间元素的下标时也可用mid=(right-left)/2+left。

(2)代码举例:

这是升序的例子

#include <stdio.h>
int main()
{
  int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
  int k = 7;//要查找的数字
  int left = 0;
  int right = sizeof(arr) / sizeof(arr[0]) - 1;
  int flag = 0;
  while (left <=right)
  {
    int mid = (right - left) / 2 + left;//找出数字中的中间元素
    if (arr[mid] < k)
    {
      left = mid + 1;
    }
    else if (arr[mid] > k)
    {
      right = mid - 1;
    }
    else
    {
      printf("找到了,下标是%d\n", mid);
      flag = 1;
      break;
    }
  }
  if (flag == 0)
  {
    printf("找不到了\n");
  }
  return 0;
}

画图描述:

重点是mid和左右下标的更新,

每次当中间元素的值<指定值时,left=mid+1,此时left左边的数据全部不符合,一次性就筛选了一半;

每次当中间元素的值>指定值时,right=mid-1,此时right右边的数据全部不符合,一次性又筛选了一半。

当要查找的数字是7时,运行的结果是:

当要查找的数字是17时:


目录
相关文章
|
9月前
|
算法
arr = [1,2,5,8,9,10,20,30,40] 有一个从小到大排序好的数组,现在输入一个数,要求按照原来的规律插入到数组中
arr = [1,2,5,8,9,10,20,30,40] 有一个从小到大排序好的数组,现在输入一个数,要求按照原来的规律插入到数组中
|
1月前
58.有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中
58.有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中
20 0
|
1月前
|
算法 测试技术 Serverless
【二分查找】【C++算法】378. 有序矩阵中第 K 小的元素
【二分查找】【C++算法】378. 有序矩阵中第 K 小的元素
|
1月前
|
算法 测试技术 C#
C++二分查找或并集查找:交换得到字典序最小的数组
C++二分查找或并集查找:交换得到字典序最小的数组
|
6月前
|
算法 测试技术 C++
C++二分查找算法:有序矩阵中的第 k 个最小数组和(一)
C++二分查找算法:有序矩阵中的第 k 个最小数组和
|
6月前
|
算法 测试技术 C#
C++二分查找算法:有序矩阵中的第 k 个最小数组和(二)
C++二分查找算法:有序矩阵中的第 k 个最小数组和
|
7月前
|
C语言
【C语言刷题】调整奇数偶数顺序、有序序列合并以及有序序列判断
【C语言刷题】调整奇数偶数顺序、有序序列合并以及有序序列判断
44 0
|
10月前
|
人工智能
有序序列中插入一个整数
有序序列中插入一个整数
56 0
7-234 两个有序序列的中位数
7-234 两个有序序列的中位数
86 0
|
算法 Java
在排序数组中查找数字I(剑指offer 53-I)
在排序数组中查找数字I(剑指offer 53-I)