第2章 递归与分治策略,二分搜索技术(查找不成功时,返回区间位置)

0003算法笔记——【分治法】分治法与二分搜索,棋盘覆盖问题 1、分治法 分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同。递归的解这些子问题,然后将各子问题的解合并得到原问题的解。      分治法所能解决的问题一般具有以下几个特征:   1) 该问题的规模缩小到一定的程度就可以容易地解决   2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。   3) 利用该问题分解出 阅读详情

当要查找的数x不在有序数组a中时,返回第一个大于x的数的位置或第一个小于x的数的位置

 

lowend,midend,highend表示查找结束时各游标的值,low,mid,high表示使查找结束的最后一次操作时,各游标的值。

 

查找结束的条件是lowend>highend,由于lowend的值由mid+1得到,highend的值由mid-1得到,所以,

当lowend>highend时,lowend=highend+1。

 

考虑使查找结束的最后一次操作,即使得lowend=highend+1的操作:

x>a[mid]时,lowend=mid+1使得lowend=highend+1,所以,这时的mid=high

因为highend=high=mid,所以x>a[highend],即,a[highend]是小于x的第一个数,a[lowend]是大于x的第一个数。

 

x<a[mid]时,highend=mid-1使得lowend=highend+1,所以,这时的low=mid

因为lowend=low=mid,所以x<a[lowend],即,a[lowend]是大于x的第一个数,a[highend]是小于x的第一个数。

 

综上所述:当要查找的数x不在有序数组a中时,lowend为第一个大于x的数的位置,highend为第一个小于x的数的位置。

 

 

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>

using namespace std;

#define MAXN 100

int BSearch(int a[], int low, int high, int x)
{
	while (low <= high)
	{
		int mid = (low + high) / 2;

		if (x == a[mid])
		{
			return mid;
		}
		else if (x < a[mid])
		{
			high = mid - 1;
		}
		else
		{
			low = mid + 1;
		}
	}
	//return low;				//返回第一个大于x的数的位置
	return high;				//返回第一个小于x的数的位置
}

int main(void)
{
	int n, a[MAXN];

	while (cin>>n)
	{
		int i;
		for (i = 1; i <= n; i++)
		{
			cin>>a[i];
		}

		sort(a+1, a+n+1);
		
		for (i = 1; i <= n; i++)
		{
			cout<<a[i]<<' ';
		}
		cout<<endl;

		int num;
		cin>>num;

		cout<<BSearch(a, 1, n, num)<<endl;
	}
	return 0;
}

/*
4
1 2 4 5
*/

用递归与分治法实现元素的二分查找 /此时num[j+1]后的元素移位完成,将temp存入num[j+1],因为最后一次for循环后。// 如果中间值等于目标值,说明查找成功,返回下标。// 二分查找,找到元素返回索引值,否则返回-1。// 每次递归重新给mid赋值,改变中间值的下标。// 如果中间值大于目标值,说明目标值在左半边。// 如果中间值小于目标值,说明目标值在右半边。//调用折半插入排序函数对数列进行排序。"请输入需要进行查找的数列长度:""请输入需要进行查找的数列:"// 继续查找左半边。// 继续查找右半边。 阅读详情

相关推荐

6-52 二分查找升级版-查找最接近元素

对二分查找算法进行改进,如果查找成功,函数返回此元素;若查找不成功,则返回最接近的元素,如果正好处于两数中间,则返回左边的元素。

燕朝铭的博客 1440

二分查找

二分查找 也称折半查找,是一种在有序数组中查找某一特定元素的搜索算法。折半查找的查找过程为:从表的中间记录开始,如果给定值和中间记录的关键字相等,则查找成功;如果给定值大于或者小于中间记录的关键字,则在表中大于或小于中间记录的那一半中查找,这样重复操作,直到查找成功,或者在某一步中查找区间为空,则代表查找失败。 (1) 当所查找的元素重复出现时,则搜索结束后返回的下标不一定是第一次出现的位...

liqian__的博客 247

基于分治法的二分搜索C语言实现与解析

回顾全文,你会发现,二分搜索之所以经典,不仅仅是因为它快,而是因为它集中体现了算法设计的核心美学:利用结构信息剪枝无效空间每一步决策都有数学保障简洁形式下隐藏着工程细节的千锤百炼它像一把锋利的小刀,专治各种“大海捞针”难题。而掌握它的过程,其实就是学会如何把直觉转化为严密逻辑的过程。所以下次当你面对一个复杂问题时,不妨问问自己:“我能把它切成两半吗?切完之后,我能扔掉一半不管吗?如果答案是 YES,恭喜你,你已经掌握了分治的精髓。🎯✨结语赠言。

weixin_28931449的博客 976

C++二分查找法改进版

这里针对数组中有多个重复元素对二分查找法进行了如下的改进 floor函数:在arr中寻找target,如果存在,则返回target的最小索引,如果不存在,则返回比target小的那个值的最大索引 ,如果target比arr中最小的元素都还要小,则说明target不在数组arr中,则返回-1 ceil函数:/在arr中寻找target,如果存在,则返回target的最大索引,如果不存在,则返回比ta...

Yannie's Blog 511

金蝶K3系统物料主数据后台表对应字段一览

我们说到物料表,一般是指t_icitem,但正确的说t_icitem并不是一张有,而是一张视图,不过我们对于数据库物料表中的大部分操作,都是通过此视图来完成。比如经常通过此视图,来成批修改数量,单价精度,是否启用批次等一些字段,有的时候,对于账套已经启用,并且已经有业务发生的物料,有一些关键属性也需要通过修改物料表t_icitem来进行。 当然修改的时候,需要考虑一些前提条件的。 比如说我有一个客户新建的账套,在月底结账时发现,要改一种成本核算方法,启用时用的是加权平法,现在想改成移动平均法,这样的情况,

hzfw2008的博客 1万+

Zemax热分析实战:多重结构编辑器与操作数优化技巧

本文详细介绍了在Zemax中进行热分析的全流程,重点讲解了如何利用多重结构编辑器模拟不同温度环境,并通过TENP、CRVT、THIC等关键操作数建立热膨胀模型。文章结合双胶合透镜实例,阐述了如何设置热跟随、构建多温度评价函数,并运用锤型优化提升光学系统在全温度范围内的热稳定性与成像质量。

yog99的博客 575

【数据结构和算法】(3)对二分查找算法的进一步优化和理解

有关二分查算法的进一步优化,对Java中的二分查找算法的认识

zjj_flower的博客 491

EndNote全文检索实战:如何快速配置学校图书馆资源并精准查找文献

本文详细介绍了EndNote全文检索功能的实战配置方法,核心在于通过正确设置OpenURL链接解析器,无缝对接学校图书馆资源,实现一键精准获取文献全文。文章提供了从理解机制、四步配置法到进阶技巧的完整指南,帮助科研人员高效管理海量PDF,构建个人知识体系,大幅提升文献调研与写作效率。

weixin_29228781的博客 278

数据结构与算法——8.二分查找

首先,我们来介绍一下二分查找在有序数组A内,现在需要查找目标值target,如果找到,返回目标值的索引,如果没找到,但会-1二分查找就是为了解决这样的一个问题而产生的一种算法;下面来介绍一下算法。二分查找有一个前提,即这必须是一个有序的数组(通常是升序的),即 A0

m0_52096593的博客 727

android6 usb默认文件管理,不弹RSA配对提示框

本文修改针对 高通 Android6.0.1 出user版本时 https://www.cnblogs.com/Jokeyyu/p/7424262.html http://blog.youkuaiyun.com/sinc00/article/details/44957943 diff --git a/frameworks/base/packages/SystemUI/src/com/android...

木叶风的博客 692

别再凭感觉了!手把手教你用Excel搞定激光器MPE与NOHD安全计算(附模板下载)

本文详细介绍了如何利用Excel自动化计算激光器的MPE(最大允许照射量)和NOHD(标称眼危害距离),提升激光安全评估的效率和准确性。通过实战案例和模板下载,帮助工程师快速掌握GB/T 7247标准中的关键计算,避免常见错误,适用于激光测距仪等设备的安评工作。

weixin_30954265的博客 466

算法设计与分析——递归与分治策略

文章目录1. 递归算法1.1 特点1.2 优缺点2. 分治策略2.1 基本思想2.2 适用的条件2.3 求解过程(步骤)3. 典型算法案例3.1 二分搜索3.1.1 非递归实现3.1.1 递归实现3.2 棋盘覆盖问题 1. 递归算法 1.1 特点 1.2 优缺点 优点:结构清晰、可读性强 缺点:运行时效率较低,耗费较多的时间、空间资源 2. 分治策略 2.1 基本思想 分治策略的基本思想是将一个规模为n的问题分解为k个较小的子问题,这些子问题互相独立,并且和原问题相同,递归

krain的博客 3566

空地多无人平台协同路径规划复现:从建模到Matlab仿真全解析

路径规划是机器人领域的核心基础技术,从单机避障到多平台协同,问题复杂度显著提升。空地协同规划融合无人机与无人车的异构优势,通过将地图分层建模为空中与地面栅格,并采用A*算法生成初始路径、B样条平滑以及改进遗传算法进行任务分配与时间同步优化,能够有效处理几何约束、运动学约束和避碰约束等。该技术广泛应用于区域巡逻、目标搜索、物资转运等任务场景,也是高校论文复现和工程仿真的常见课题。本文从问题建模、算法设计到Matlab代码结构,系统梳理了一套空地多无人平台协同路径规划的复现思路,同时给出坐标系校准、遗传算法收敛

weixin_32175665的博客 248

分治算法(一)二分搜索技术

分治算法的本质就是将一个大规模的问题分解为若干个小规模的相同子问题,分而治之。 1.分治算法简述 1.1分治算法也有它的适用条件,满足以下3个条件,才能使用分治法来解决: (1)原问题可分解为若干个规模较小的相同子问题 (2)子问题相互独立 (3)子问题的解可以合并为原问题的解 1.2使用分治法解题的步骤: (1)分解:将要解决的问题分解为若干个规模较小、相互独立、与原问题形式相同的子问题。 (2...

sinat_28753227的博客 6082

13、数据可视化与分组操作:Danfo.js 实战指南

本文深入介绍了如何使用 Danfo.js 进行数据可视化与分组操作。内容涵盖多种图表的创建与配置,如折线图、散点图、箱线图、小提琴图、直方图和柱状图,并结合 Plotly.js 实现丰富的交互式可视化效果。同时,详细讲解了数据聚合的‘分割-应用-组合’模式,包括分组数据、遍历分组、apply 方法及 agg 聚合操作,帮助开发者高效处理和分析结构化数据。适用于 Dnotebook、HTML 及主流前端框架的应用场景。

o1p2q3r的博客 98

safetymonitorapi

Summary of SA8653 Safety Monitor API Introduction This document details Safety Monitor APIs for the SA8653 QNNX platform, covering dual interfaces of APSS and SAIL. It defines core data structures and enumerations for subsystems, fault severity and health

qq_39257814的博客 1588

分治算法——二分搜索的c++实现

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录问题描述细节须知算法原理算法的思路算法的分析 问题描述 给定已排好序的n个元素组成的数组,现要利用二分搜索算法判断特定元素x是否在该有序数组中 细节须知 (1)由于可能需要对分治策略实现二分搜索的算法效率进行评估,故使用大量的随机数对算法进行实验(生成随机数的方法见前篇随笔)。 (2)由于二分搜索需要数据为有序的,故在进行搜索前利用函数库中sort函数对输入的数据进行排序。 (3)代码主要用到的是经典的二分查找加上递归。 (4)

yuanmartin的博客 2577

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

算法分析与设计——实验1: 递归与分治

1、归并排序问题:对n个元素组成的序列进行排序。 将待排序元素分成大小大致相同的两个子集合,分别对两个集合进行排序,最终将排序好的子集合合并成所要求的排好序的集合。 2、使用二分搜索算法查找任意n个有序数列中的指定元素。至少使用两种方法进行编程。

阮阮的阮阮的博客 3007

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

递归与分治

一、递归与分治概述: 1、分治方法在于分和治。将一定规模的问题划分成性质相同的若干个小问题,分;对于每个小问题,进行所需要进行的操作,如排序等。 2、关于递归: (1)递归中需要的成分是递归边界和递归规则,没有递归边界递归无法停止、无法进行。 (2)通过将各层的关系从小到大逐渐带入,可以求解出一个函数的非递归表达式。 (3)n该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共...

qq_41464448的博客 2725

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【分治】二分搜索

🍀【分治】二分搜索

一个专注于客户端开发的技术er,不定期更新Android,Flutter,HormonyOS等方向的使用心得和感悟 1304

分治策略+二分查找

二分查找及其升级版

hello_world_juns的博客 959

递归和分治策略

一个分治法将规模为n的问题分成k个规模为n/m的子问题去解。在一个2^k×2^k 个方格组成的棋盘中,恰有一个方格与其它方格不 同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。同样的分治策略,将2^k×2^k 个方格组成的棋盘分割为2^k-1×2^k-1个子棋盘,特殊方格位于4个较小棋盘之一中,其余三个子棋盘中无特殊方格。这个的做法我们找到的递推关系其实比较简单,如果你实验了 n = 1,n = 2之后,就会发现首先要将n-1个移动到中间塔座,然后将第n个移动到目标塔座,最后在将n-1移动到目标塔座。

wjm041006的博客 1103

二分搜索-分治法经典例子

二分搜索是一种在有序数组中高效查找目标值的算法,通过不断将搜索范围减半实现O(logn)的时间复杂度。其前提是数组有序,需要注意边界处理、索引计算(推荐使用left+(right-left)/2避免溢出)以及重复元素的处理。二分搜索可通过循环或递归实现,体现了分治策略的核心思想——分解问题为更小规模子问题。时间复杂度推导显示其效率与对数成正比,而中间索引的优化计算是为了防止整数溢出问题。

Lok877043018的博客 702

第5章递归:分治法

分治法是一种高效的问题解决策略,通过"分解-解决-合并"三步处理复杂问题。文章详细介绍了分治法的基本原理、实施步骤和典型应用(如归并排序、快速排序),并以括号匹配问题为例,展示了分治法的具体实现。算法通过递归将问题分解为更小的子问题,根据括号平衡度找到分割点,分别处理包裹结构和并列结构,最终合并子问题的解。文中还给出了类C伪代码和详细的执行过程分析,说明分治法如何有效解决括号匹配问题。

计算机科学、人工智能、数据分析和大数据方向的研发和教学。 1142

递归与分治策略之二分搜索(Java版本)

/**  * 递归二分搜索  * @param a 待搜索数组,该数组假设为升序数组。  * @param l 待搜索数组的最小下标  * @param r 待搜索数组的最小下标  * @param x 所查找的数值  * @return 返回数组中元素的位置,如果没有该元素,返回-1  */  private int recursiveSearch(int[] a,int l,i

TechNerd的专栏 892
上一篇: 第3章 动态规划,算法分析题3-3 漂亮打印
下一篇: 计算几何——Uva 270 Lining Up
庞老板
博客等级 码龄15年 127粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

庞老板

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值