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

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

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时:


目录
相关文章
|
8月前
|
设计模式 算法 Java
【数据结构和算法】删掉一个元素以后全为 1 的最长子数组
这是力扣的 1493 题,难度为中等,解题方案有很多种,本文讲解我认为最奇妙的一种。又又又是一道滑动窗口的典型例题,可以帮助我们巩固滑动窗口算法。这道题很活灵活现,需要加深对题意的变相理解。给你一个二进制数组nums,你需要从中删掉一个元素。 请你在删掉元素的结果数组中,返回最长的且只包含 1 的非空子数组的长度。 如果不存在这样的子数组,请返回 0 。
115 1
|
算法 测试技术 C#
C++二分查找算法:查找和最小的 K 对数字
C++二分查找算法:查找和最小的 K 对数字
|
4月前
|
C语言 Python
有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
321 4
|
7月前
|
C++
给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200
给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200
|
8月前
58.有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中
58.有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中
40 0
|
8月前
|
算法 测试技术 C#
C++二分查找或并集查找:交换得到字典序最小的数组
C++二分查找或并集查找:交换得到字典序最小的数组
|
算法 测试技术 C#
C++二分查找算法:有序矩阵中的第 k 个最小数组和(二)
C++二分查找算法:有序矩阵中的第 k 个最小数组和
|
算法 测试技术 C++
C++二分查找算法:有序矩阵中的第 k 个最小数组和(一)
C++二分查找算法:有序矩阵中的第 k 个最小数组和
|
C语言
【C语言刷题】调整奇数偶数顺序、有序序列合并以及有序序列判断
【C语言刷题】调整奇数偶数顺序、有序序列合并以及有序序列判断
71 0
|
人工智能
有序序列中插入一个整数
有序序列中插入一个整数
88 0