二分查找
- 🌈前言
- ☃️使用条件:
- 🤔📝算法思维:
- 🚀实战练习:
🌈前言
二分查找也称折半查找(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,如下图所示
- 删除一半数据后,继续上面的操作,让 middle = (5 + 8)/ 2,得到下标 6 ,对应数字 10
- 再进行比较,我们发现,该数字 = 目标 K,则查找完成,如下图所示!
- 如果还未找到,这继续重复上面步骤,折半删除,直到找到为止。
- 另外,为了防止数据溢出
- 使用 middle = left + (right - left)/ 2 的方法来计算 middle;
- left + (right - left)/ 2 等价于 (left + right)/ 2,都是求平均值。
2、小结:
- 由上面的例子我们可以看到,使用二分查找的方法在一组有序序列中可以快速地找到目标数字。
- 如果把上面的数组进行遍历,从头开始一个一个地找,需要找 “7次”才能找到目标数字。
- 而采用二分查找,只需找了“两次”就已经找到目标数字,这大大提高了查找地效率。
🚀实战练习:
给定一个 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;
}