二分查找(折半查找)简介与代码实现(C++)
二分查找(折半查找)简介与代码实现
- 1.简介
- 2.代码实现(C++)
- 2.1.写法一(target在左闭右闭区间)
- 2.2.写法二(target在左闭右开区间)
- 3.代码检验
1.简介
二分查找的本质:
首先确定待查元素所在的范围,然后逐步缩小范围(区间),直到查找到元素或者查找失败为止。
二分查找的前提:
数组必须是有序的
2.代码实现(C++)
2.1.写法一(target在左闭右闭区间)
1.因为left与right相等的情况在[left,right]区间有意义,所以在while(left <= right)中要使用<=
2.如果nums[middle]大于target,则更新搜索范围右下标right为middle - 1。因为接下来要查找的左区间结束下标的位置是middle - 1。
//版本一
class Solution1 {public:int search(vector<int>& nums, int target) {int left = 0;//定义target在左闭右闭的区间,即[left,right]int right = nums.size() - 1;//当left==right时,[left,right]区间依然有效,所以使用<=while (left <= right) {//防止溢出,等同于(left+right)/2int middle = left + ((right - left) / 2);if (nums[middle] > target) {right = middle - 1;//target在左区间[left,middle-1]}else if (nums[middle] < target) {left = middle + 1;//target在右区间[middle+1,right]}else {//nums[middle]==targetreturn middle;//在数组中找到目标值,直接返回下标}}//未找到目标值return -1;}
};
2.2.写法二(target在左闭右开区间)
1.因为left与right相等的情况在[left,right]区间没有意义,所以在while(left < right)中要使用<
2.如果nums[middle] 大于 target ,则 right 更新为 nums[middle]
//版本二
class Solution2 {public:int search(vector<int>& nums, int target) {int left = 0;//定义target在左闭右开的区间,即[left,right)int right = nums.size();//当left==right时,[left,right),是无效空间,所以使用<while (left < right) {//防止溢出,等同于(left+right)/2int middle = left + ((right - left) >> 1 );if (nums[middle] > target) {right = middle;//target在左区间[left,middle)}else if (nums[middle] < target) {left = middle + 1;//target在右区间[middle+1,right)}else {//nums[middle]==targetreturn middle;//在数组中找到目标值,直接返回下标}}//未找到目标值return -1;}
};
3.代码检验
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;//版本一
class Solution1 {public:int search(vector<int>& nums, int target) {int left = 0;//定义target在左闭右闭的区间,即[left,right]int right = nums.size() - 1;//当left==right时,[left,right]区间依然有效,所以使用<=while (left <= right) {//防止溢出,等同于(left+right)/2int middle = left + ((right - left) / 2);if (nums[middle] > target) {right = middle - 1;//target在左区间[left,middle-1]}else if (nums[middle] < target) {left = middle + 1;//target在右区间[middle+1,right]}else {//nums[middle]==targetreturn middle;//在数组中找到目标值,直接返回下标}}//未找到目标值return -1;}
};//版本二
class Solution2 {public:int search(vector<int>& nums, int target) {int left = 0;//定义target在左闭右开的区间,即[left,right)int right = nums.size();//当left==right时,[left,right),是无效空间,所以使用<while (left < right) {//防止溢出,等同于(left+right)/2int middle = left + ((right - left) >> 1 );if (nums[middle] > target) {right = middle;//target在左区间[left,middle)}else if (nums[middle] < target) {left = middle + 1;//target在右区间[middle+1,right)}else {//nums[middle]==targetreturn middle;//在数组中找到目标值,直接返回下标}}//未找到目标值return -1;}
};int main() {//创建数组vector<int>arr;//为数组添加元素cout << "查找temp最后被赋值的元素在排序后的数组中的位置" << endl;cout << "添加到数组内的元素:" << endl;int temp = 0;//查找temp最后被赋值的元素在排序后的数组中的位置for (int i = 0; i < 10; i++) {temp = rand() % 101;arr.push_back(temp);cout << temp << " ";}cout << endl;//为数组排序sort(arr.begin(), arr.end());cout << "输出排序后的数组" << endl;for (int i = 0; i < arr.size(); i++) {cout << arr.at(i) << " ";}cout << endl;//分别使用两种二分查找,查找temp最后被赋值的元素在排序后的数组中的位置Solution1 S1;Solution2 S2;cout << "使用方法一,目标值的下标为:" << endl << S1.search(arr, temp) << endl;cout << "使用方法二,目标值的下标为:" << endl << S1.search(arr, temp) << endl;}
运行截图:
二分查找(折半查找)简介与代码实现(C++)相关推荐
- 二分查找/折半查找算法
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中元素是按升序排列,将表 ...
- c语言折半查找输出坐标,数据结构(C语言版)——有序表查找(折半查找)(代码版)...
数据结构(C语言版)--有序表查找(折半查找)(代码版) 数据结构(C语言版)--有序表查找(折半查找)(代码版) #include #include #define ERROR 0 #define ...
- 顺序表查找+折半查找(二级)
我们讲了各种数据 结构之后,比如讲了线性表了,讲了栈和队列,讲了树和二叉树,讲了图之后呢,我们最后还有两个专题,一个叫查找,一个叫排序,我们先看看查找,查找包括哪些内容啊,第一个线性表的查找,数组或者 ...
- Python二分查找/折半查找算法详解--(面试常考)
https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究) 二分查找也称折 ...
- swift版 二分查找 (折半查找)
二分查找作为一种常见的查找方法,将原本是线性时间提升到了对数时间范围之内,大大缩短了搜索时间,但它有一个前提,就是必须在有序数据中进行查找.废话少说,直接上代码,可复制粘贴直接出结果! import ...
- C语言数组查找(线性查找 折半查找)
线性查找 #include <stdio.h> #include <math.h>void find_nine(int numbers[]) {int i;for(i = 0; ...
- 顺序查找 折半查找 二叉排序树
1.顺序查找,折半查找,二叉排序树操作定义 SeqSearch.h #include<stdio.h> #define ARRAYLEN 8int source[]={69, 65, 90 ...
- php折半查找算法,二分查找 [折半查找] 算法 PHP 版
查找表:就是同一类型的数据元素构成的数据集合 有静态表和动态表 本文实现PHP版的二分查找算法[本算法仅用于顺序存储的查找表] /** * Created by PhpStorm. * User: 1 ...
- DS查找—折半查找求阶乘函数后K个零
题目描述 f(x) 是 x! 末尾是 0 的数量,给定 K,找出多少个非负整数 x ,能满足 f(x) = K . (x! = 1 * 2 * 3 * - * x,且 0! = 1 ) 例如, f(3 ...
- c语言实验报告 折半查找法,C语言数组之冒泡排序+折半查找法(二分查找)
冒泡排序算法 将相邻的元素进行两两比较,大的向后"冒", 小的向前"赶". 口诀: N个数字来排队,两两比较小靠前 外层循环N-1(控制需要比较的轮数). 内层 ...
最新文章
- aptana手动配置python环境_Aptana Studio 3中通过Auto Config配置PyDev中Python出错
- 内存中有两个4字节以压缩的bcd_卷积神经网络的压缩与加速 -- 剪枝(PRUNING)论文(二)...
- mvn install java版本,maven的打包命令--assemblyinstall和maven update之后jdk版本变回1.5的问题...
- php把数据创建一个表格,PHP创建(导出Excel数据表格)
- 手机编译mysql_玩转MySQL 8.0源码编译
- shell编程入门步步高(九、sed和awk)
- CentOS 安装 rz sz
- prototype中文参数乱码解决方案
- 海外媒体稿件内容怎么写更出色
- ICLR 22 GIANT ,UIUC UCLA OGB榜单
- 快速入门solidity
- matlab 求矩阵的逆
- 你好,法语!A2知识点总结(1)
- HTML5APP商业开发实战教程——基于WeX5可视化开发平台
- JS中的CommonJS和AMD
- 王立柱《c语言》3.5.4
- 海底捞只要“面子”,不要“里子”?
- Kinect的介绍和应用【转】
- go 基于gin编写encode、decode、base64加密接口
- vue项目中集成腾讯TIM即时通讯(附源码)