猫史档案馆


【二分查找法】二分查找算法略解()

用户:1111111111111111211111111111111112查看:10 回复:5 评论:10 创建时间:2023-08-06T14:14:50


/*二分查找是一种常用的查找算法,它适用于有序数组中的查找操作。它的原理是通过将数组分成两部分,然后判断目标值在哪一部分中,从而缩小查找范围,直到找到目标值或者确定目标值不存在。


那么,我们可以通过一个猜数字的游戏来解释二分查找算法。

假设你有一个1到100之间的整数,让你猜这个数字是多少。每次你猜一个数字,系统会告诉你猜的数字是太大了还是太小了,直到你猜中为止。

首先,我们将猜测的范围缩小到1到100的中间值,也就是50。然后,系统会告诉你猜的数字是太大了还是太小了。

如果系统告诉你猜的数字太大了,那么我们可以将猜测的范围缩小到1到50的中间值,也就是25。如果系统告诉你猜的数字太小了,那么我们可以将猜测的范围缩小到50到100的中间值,也就是75。

通过不断缩小猜测的范围,我们可以在每次猜测后将范围缩小一半,直到猜中目标数字。
这其实就是2分查找基本原理。

那么,使用2分查找的数组需要满足哪些条件?
数组要有序。这个相信都能理解。


*/

#include <iostream>
using namespace std;

// 二分查找函数
int binarySearch(int arr[], int target, int left, int right) {
    while (left <= right) {
        int mid = left + (right - left) / 2; // 计算中间位置

        if (arr[mid] == target) {
            return mid; // 找到目标值,返回索引
        }
        else if (arr[mid] < target) {
            left = mid + 1; // 目标值在右半部分,更新左边界
        }
        else {
            right = mid - 1; // 目标值在左半部分,更新右边界
        }
    }

    return -1; // 目标值不存在,返回-1
}

int main() {
    int arr[] = { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 };
    int target = 12;
    int n = sizeof(arr) / sizeof(arr[0]);

    int result = binarySearch(arr, target, 0, n - 1);

    if (result == -1) {
        cout << "目标值不存在" << endl;
    }
    else {
        cout << "目标值在数组中的索引为:" << result << endl;
    }

    return 0;
}





l

为啥要left<=right?因为左右区间一旦交叉,那么要么就说明找到了,要么说明整个数组无该元素,直接退出。

另外,如果需要对数组排序,可以用标准库的sort快速排序函数。

 

最后是一道2分查找的变形题目

【题目】

输入一个整数n,x,接下来输入n个整数,可能会重复。现在查找x,输出x在数组中第一次出现的位置(保证数组有目标元素x)

【样例输入】

5 4

1 2 3 4 4 

【样例输出】

4

【样例解释】

数组中有2个4,按照题目要求,输出第一个4出现位置,为4

本帖只是略解,有不懂的评论区或者直接查看知乎上这篇文章,讲的比较详细图文并茂带你入门二分查找算法 - 知乎 (zhihu.com)


回复

上一页1 页 / 共 1下一页
囧仙_official囧仙_official

mid直接写

mid=l+r>>1即可,问就是中点公式

点赞1


评论


一只小枫鸽一只小枫鸽

啊,为啥你的算法教程就有人评论()

点赞0


评论


tiger666250tiger666250

给你一个小练习吧()

 

https://www.luogu.com.cn/problem/P9497

 

洛谷月赛打到的就是二分查找()

点赞0


评论


tiger666250tiger666250

顺面附赠一个昨天才打过的二分()

 

int find(int x){
	int l=1,r=n*n;//这边r=数组长度哈()
	while(l<r){
		int mid=l+(r-l)/2;
		if(arr[mid]>=x)r=mid;
		else l=mid+1;
	}
	return l;
}

 

 

点赞0


评论


初夏晴雨初夏晴雨

支持

点赞2


评论