二分查找又称折半查找(Binary Search)
  joJp3k0vX7Vq 2023年11月02日 46 0



二分查找

  • 🌈前言
  • ☃️使用条件:
  • 🤔📝算法思维:
  • 🚀实战练习:


🌈前言

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。


☃️使用条件:

  • 必须是一个有序的序列
  • 例如:在1,2,3,5,7,9,10,15,18中,查找到 10 这个数字,它是一个有序的数列,因此可以使用二分查找!

🤔📝算法思维:

二分查找又称折半查找,顾名思义就是用折半的方法去找到目标数字,这让可以非常高效地找到目标,不需要每次都要从头开始找

1、开始查找:设目标数字为 K,让 middle =(left+right)/2找到中间数字下标4对应的数字 7 ,然后跟目标数字进行比较:

  • 如果 该数字 > 目标 K,则把右边的数折半删除掉,让right = middle - 1
  • 如果 该数字 < 目标 K,则把左边的数折半删除掉,让left = middle + 1,如下图所示

二分查找又称折半查找(Binary Search)_二分查找

  • 删除一半数据后,继续上面的操作,让 middle = (5 + 8)/ 2,得到下标 6 ,对应数字 10
  • 再进行比较,我们发现,该数字 = 目标 K,则查找完成,如下图所示!
  • 如果还未找到,这继续重复上面步骤,折半删除,直到找到为止。
  • 另外,为了防止数据溢出
  • 使用 middle = left + (right - left)/ 2 的方法来计算 middle;
  • left + (right - left)/ 2 等价于 (left + right)/ 2,都是求平均值。

2、小结

  • 由上面的例子我们可以看到,使用二分查找的方法在一组有序序列中可以快速地找到目标数字。
  • 如果把上面的数组进行遍历,从头开始一个一个地找,需要找 “7次”才能找到目标数字。
  • 采用二分查找,只需找了“两次”就已经找到目标数字,这大大提高了查找地效率

🚀实战练习:

题目来源:【LeetCode】704. 二分查找

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

示例:

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4

代码+解析:

#include<stdio.h>

//主体部分
int search(int* nums, int numsSize, int target){
    int left = 0;//左下标
    int right = numsSize-1;//右下表
    
     //left <= right这一条件恒成立,当left>right时,则说明这个数组内没有要找的目标数字
    while(left <= right )//因为查找可能有多次,所有实现循环结构
    {
        int middle = left + (right-left)/2;

		//将查找到的数于目标数字进行比较
        if(nums[middle] < target)
        {
           left = middle+1;//左边折半删除
        }
        else if(nums[middle] > target)
        {
            right = middle-1;//右边折半删除
        }
        else
        {
            return middle;//找到目标数字,返回middle
        }
    }
    return -1;//当left>right时,则说明这个数组内没有要找的目标数字
}
//


int main()
{
	int nums[] = {-1,0,3,5,9,12};//定义nums数组
	
	int target = 9;目标数字
	
	int numsSize = sizeof(nums)/sizeof(nums[0]);//计算出数组长度
	
	search(nums, numsSize, target)//调用函数实现查找

	return 0;
}


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
joJp3k0vX7Vq