C++ 算法——二分查找

如果要你在一个升序序列中查找一个值的位置,你是否还会傻乎乎的用下面这个 O ( n ) \mathcal O(n) O(n) 的代码暴力查找,如果是,我告诉你,其实根本不用这么做。

int find(int a[],int n,int k) {
	for(int i=0;i<n;++i) if(a[i]==k) return i;
}

猜数字这个游戏大家都玩过吧,这里介绍以下规则:

  1. 一名玩家在一个范围内想出一个数。
  2. 这名玩家告诉其他玩家他所想的范围。
  3. 其他玩家在这个范围内猜数,若:
    • 猜中了:该玩家获胜
    • 没猜中:根据该玩家猜的数缩小范围,然后接着进行操作 2。对于缩小范围,设初始范围为 l ∼ y l\sim y ly,要猜的数为 n n n,猜的数位 n n n,若:
      • m < n m<n m<n,将范围缩小至 m ∼ r m\sim r mr
      • m > n m>n m>n,将范围缩小至 l ∼ m l\sim m lm

显然,想要最快猜到该数,就需要采用折半的方法去猜,每次都猜这个范围的中间数。二分查找也是一样,对于每一次查找,都判断中间的数与要找的数的大小关系,然后采取对应的操作。

需要注意的是,二分查找需要保证序列是升序的。

这里放个代码:

//循环版
int find(int a[],int n,int k) {
	int l=0,r=n-1;
	while(l<=r) {
		int mid=(l+r)/2;
		if(a[mid]>k) r=mid-1;
		else if(a[mid]<k) l=mid+1;
		else if(a[mid]==k) return mid;
	}
	return -1;
}
//递归版
int find(int a[],int n,int k,int l,int r) {
	if(l>r) return -1;
	int mid=(l+r)/2;
	if(a[mid]>k) return find(a,n,k,l,mid-1);
	else if(a[mid]<k) return find(a,n,k,mid+1,r);
	else if(a[mid]==k) return mid;
}

练习题:洛谷 link

相关推荐

  1. C++ 算法——二分查找

    2024-07-09 23:26:01       20 阅读
  2. 简单二分查找C++算法

    2024-07-09 23:26:01       60 阅读
  3. 突破编程_C++_查找算法二分查找

    2024-07-09 23:26:01       46 阅读
  4. 算法二分查找C语言版)

    2024-07-09 23:26:01       30 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-09 23:26:01       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-09 23:26:01       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-09 23:26:01       58 阅读
  4. Python语言-面向对象

    2024-07-09 23:26:01       69 阅读

热门阅读

  1. Spring事务

    2024-07-09 23:26:01       20 阅读
  2. c# 基础习题答案 20240709

    2024-07-09 23:26:01       18 阅读
  3. MAC下的PDM工具

    2024-07-09 23:26:01       22 阅读
  4. Dubbo源码解析-过滤器Filter

    2024-07-09 23:26:01       22 阅读
  5. 开源大模型对比

    2024-07-09 23:26:01       27 阅读
  6. Mongodb索引的删除

    2024-07-09 23:26:01       20 阅读
  7. ubuntu minio在线安装、开机启动

    2024-07-09 23:26:01       21 阅读
  8. 正则表达式-使用笔记

    2024-07-09 23:26:01       27 阅读
  9. TensorFlow 的基本概念和使用场景

    2024-07-09 23:26:01       20 阅读
  10. Perl 语言开发(七):哈希和关联数组

    2024-07-09 23:26:01       23 阅读
  11. Linux上web服务器搭建(Apache、Nginx)

    2024-07-09 23:26:01       18 阅读
  12. Apache tika 实现各种文档内容解析

    2024-07-09 23:26:01       30 阅读