二分查找(序列是顺序的运用递归)

算法--第三章 目录 一.单选题 二.多选题 补充的题 知识点 一.单选题 1 【单选题】n个元素最小值问题的分治算法分解方法错误的是()。 A、 划分为2个规模大致相等的子问题 B、 从中间将n个元素划分为两部分 C、 n个元素的位置下界left、上界right,分解操作为(left+right)/2 D、 将n个元素分解为多个子问题,子问题之间不独立 正确答案: D 2 【单选题】有关2个n位大整数乘法问题说法错误的是()。 A、 将两个n位大整数分解为.. 阅读详情
package com.search;

import java.util.ArrayList;
import java.util.List;

/**
 * @Auther: 大哥的叔
 * @Date: 2019/8/9 17:21
 * @Description:
 */
//注意:使用二分查找的前提是 该数组是有序的
public class BinarySearch {
    public static void main (String[] args) {
        int arr[] = { 1, 8, 10, 89,1000,1000, 1234 };
        int resIndex = binarySearch(arr,0,arr.length-1,89);
        System.out.println(resIndex);

        List<Integer> resIndexList = binarySearch2(arr, 0, arr.length - 1, 1000);
        System.out.println("resIndexList=" + resIndexList);
    }


     // 二分查找算法
     /**
     *
     * @param arr
     *            数组
     * @param left
     *            左边的索引
     * @param right
     *            右边的索引
     * @param findVal
     *            要查找的值
     * @return 如果找到就返回下标,如果没有找到,就返回 -1
     */
    public static int binarySearch(int[] arr,int left,int right,int findVal){
        if (left > right) {
            return -1;
        }
        int mid = (left+right)/2;
        int midVal = arr[mid];
        if (findVal>midVal){
            return binarySearch(arr,mid+1,right,findVal);
            }else if (findVal<midVal){
            return binarySearch(arr,left,mid -1,findVal);
        }else {
            return mid;
        }
    }

    /*
     * 课后思考题: {1,8, 10, 89, 1000, 1000,1234} 当一个有序数组中,
     * 有多个相同的数值时,如何将所有的数值都查找到,比如这里的 1000
     *
     * 思路分析
     * 1. 在找到mid 索引值,不要马上返回
     * 2. 向mid 索引值的左边扫描,将所有满足 1000, 的元素的下标,加入到集合ArrayList
     * 3. 向mid 索引值的右边扫描,将所有满足 1000, 的元素的下标,加入到集合ArrayList
     * 4. 将Arraylist返回
     */
    public static List<Integer> binarySearch2(int[] arr, int left, int right, int findVal){
        System.out.println("hello~");
        // 当 left > right 时,说明递归整个数组,但是没有找到
        if (left > right) {
            return new ArrayList<Integer>();
        }
        int mid = (left + right) / 2;
        int midVal = arr[mid];

        if (findVal > midVal) { // 向 右递归
            return binarySearch2(arr, mid + 1, right, findVal);
        } else if (findVal < midVal) { // 向左递归
            return binarySearch2(arr, left, mid - 1, findVal);
        } else {
//			 * 思路分析
//			 * 1. 在找到mid 索引值,不要马上返回
//			 * 2. 向mid 索引值的左边扫描,将所有满足 1000, 的元素的下标,加入到集合ArrayList
//			 * 3. 向mid 索引值的右边扫描,将所有满足 1000, 的元素的下标,加入到集合ArrayList
//			 * 4. 将Arraylist返回

            List<Integer> resIndexlist = new ArrayList<Integer>();
            //向mid 索引值的左边扫描,将所有满足 1000, 的元素的下标,加入到集合ArrayList
            int temp = mid - 1;
            while(true) {
                if (temp < 0 || arr[temp] != findVal) {//退出
                    break;
                }
                //否则,就temp 放入到 resIndexlist
                resIndexlist.add(temp);
                temp -= 1; //temp左移
            }
            resIndexlist.add(mid);  //

            //向mid 索引值的右边扫描,将所有满足 1000, 的元素的下标,加入到集合ArrayList
            temp = mid + 1;
            while(true) {
                if (temp > arr.length - 1 || arr[temp] != findVal) {//退出
                    break;
                }
                //否则,就temp 放入到 resIndexlist
                resIndexlist.add(temp);
                temp += 1; //temp右移
            }

            return resIndexlist;
        }

    }
}

 

二分查找算法递归实现 二分查找算法个人总结 阅读详情

相关推荐

顺序查找与折半查找(二分查找)与递归折半查找

顺序查找:适用于所有数组,效率低 二分查找:使用与已序数组,效率高 一、顺序查找 #include <iostream> using namespace std; void select_sort(int list[], int num) { int min_pos = 0; //每次循环最小数的位置 for (int i = 0; i < num - 1; i++) { min_pos = i; for (int j = i + 1; j < n.

p=f/s 484

序列二分查找

序列二分查找 二分查找是在有序序列上的快速查找方法,二分查找的时间复杂度为O(logn)O(logn)O(logn),现实中很多情形我们需要先排序,然后再查找指定元素,这里就会用到二分查找 二分查找非常简单,实现上分为递归实现和非递归实现,这里其实有些需要注意的点。 原理 我们先看下原理,在一个有序的序列a:{a1,a2,...,aN}a:\{a_1,a_2,...,a_N\}a:{a1​,a2​...

whgyxy的博客 727

迭代顺序查找、递归顺序查找、二分查找

迭代顺序查找、递归顺序查找、二分查找之间的对比

二分查找(Binary Search)

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33757609的博客 367

数据结构实验六(二分查找、Hash查找)题目和源程序

实验内容 1.二分查找又称为折半查找,它要求要查找的顺序表必须是有序表,即表中结点按关键字有序.并且要用顺序存储结构。 基本思想是:首先将给定值key与表中中间位置记录的关键字相比较,若二者相等,则查找成功,否则根据比较的结果确定下次查找的范围是在中间记录的前半部分还是后半部分,然后在新的查找范围内进行同样的查找,如此重复下去,直到在表中找到关键字与给定值相等的记录,或者确定表中没有这样的记录。 编写程序构造一个有序表La,从键盘接收一个关键字key,用二分查找法在La 中查找key,若找到则提示查找成功并输出key所在的位置,否则提示没有找到信息。 2.编写程序实现Hash表的建立、删除、插入以及查找操作。 程序应包含的主要功能函数有: Hash( ):计算哈希地址 InitialHash( ):初始化哈希表 SearchHash( ):在哈希表中查找关键字 InsertHash( ):向哈希表中插入关键字 DeleteHash( ):删除哈希表中某一关键字 PrintHash ( ):打印输出哈希表

如何用Megatron-LM搭建多卡集群?手把手教你配置分布式训练环境

本文提供了一份详细的Megatron-LM多卡集群搭建实战指南。从硬件兼容性检查、软件栈版本对齐,到分布式并行策略(数据并行、张量并行、流水线并行)的配置与多节点启动脚本编写,手把手教你配置稳定高效的分布式训练环境,并分享了关键的排错与性能调优经验。

yellow的专栏 414

C语言简单实现折半查找法

介绍 折半查找,又称作二分查找。这个查找的算法的特点,就是,要求数据要是有序的。 1 ,存储结构一定是顺序存储 2 ,关键字大小必须有序排列 算法思想:折半查找只能在有序数列中进行,将待查找的数据与有序数列(递增)中间的元素进行比较,如果相等,则找到;如果待查找的数据大于中间的元素的值,那么再从数组的后一半元素中进行查找,否则,从前一半元素中进行查找;若折半后都找不到,则输出“没找着”等提...

qq_42680327的博客 6万+

全局子程序 参数调用

为什么要子程序: 为了实现程序结构化,我们尽量使用不同功能的功能块来实现一些特定的功能, 子程序接口: 使用过程的注意事项,尤其是数组使用时的注意事项 从一个主程序中可以将参数传递到局部或全局子程序和函数中。 怎样传递参数有 2 种方式: 作为 IN 参数 变量值在主程序中保持不变。 这种传递方式也称为“ 值传递 (Call by Value)”。 作为 OUT 参数 子程序读取并更改该值,然后将新值写回到主程序中。 这种传递方式也称为“Call by Reference”。 举例说明 1 DEF MY

Eric_Yang1024的博客 1095

关于[Cannot determine value type from string ‘xxx‘]的一些问题

解决Cannotdeterminevaluetypefromstring'xxx’的方法有2种实体加无参构造参数mapper.xml中查询的数据库字段属性的类型要和有参构造器的字段类型一一匹配;查询字段的个数要和有参构造器个数一样。

weixin_45966334的博客 2万+

HTPA 32x32d热成像传感器数据读取与校准全流程解析

本文详细解析了HTPA 32x32d热成像传感器的数据读取与校准全流程。从寄存器配置、原始数据采集,到核心的五大校准步骤(包括热量、电子偏移、电压、灵敏度补偿及温度转换),并涵盖像素重组、坏点修复及图像后处理,为开发者替代或升级MLX90640提供了完整、实用的操作指南。

weixin_29190169的博客 611

【强化学习】常用算法之一 “A3C”

A3C(Asynchronous Advantage Actor-Critic)算法是一种在强化学习领域中应用广泛的算法,它结合了策略梯度方法和价值函数的学习,用于近似解决马尔可夫决策过程(Markov Decision Process)问题。A3C算法在近年来备受关注,因为它在处理大规模连续动作空间和高维状态空间方面具有出色的性能。A3C算法是一种基于策略梯度的强化学习算法,通过多个并行的智能体异步地与环境交互,并利用Actor和Critic网络实现策略和价值的近似,从而实现快速而稳定的强化学习训练。

Code_and516的博客 6756

二分查找(Java版)

二分查找: 二分查找又称折半查找,它是一种效率较高的查找方法 实现原理: 通俗点来讲就是将要查找部分对折,然后分为三部分:中间部分,中间前的部分,中间后的部分,将要查找的和中间部分进行比较,如果小于中间部分则在中间部分的前面找,否则就在中间部分的后边找,然后再重复上边折半的过程 使用要求或者前提: 通过实现原理可以看出,要想使用二分查找必须满足一定条件或者前提,即查找序列必须是顺序结构和...

while false 620

Minitab田口设计实战:如何用正交试验优化遗传算法参数(附完整操作步骤)

本文详细介绍了如何利用Minitab田口设计进行遗传算法参数优化,通过正交试验方法显著提升效率。文章涵盖实验设计、Minitab操作步骤、结果分析及高级技巧,帮助工程师快速掌握这一工业级优化技术,实现算法性能的显著提升。

wind6的博客 866

查找算法-折半查找(二分查找)

二分查找算法,又叫折半查找算法,顾名思义,从其名字可见该排序算法运用了二分法进行查找。所谓二分就是将一个数组分成两部分,因为每次都是二分所以又叫折半查找,个人觉得折半很形象。

菜鸟的博客 1577

第3版•系统集成项目管理工程师(中级) │ 告别迷茫!案例分析高分攻略

🥏第3版•系统集成项目管理工程师(中级) │ 告别迷茫!案例分析高分攻略

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 3870

MATLAB基础应用精讲-【数模应用】PPO算法(附python代码实现)(二)

表示为状态转移概率和动作选择概率的乘积,因为状态和动作决定轨迹。

qq_36130719的博客 413

查找算法:二分查找

二分查找

weixin_47406709的博客 5万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

查找算法之顺序查找和二分查找

1.顺序查找 代码如下: #include<cstdio> #include<iostream> using namespace std; const int maxn = 110; int arr[maxn]; int SequenceSearch(int arr[],int key, int n); int main(){ int n,key; printf("请输入元素的个数:\n"); scanf("%d",&n); printf("请输入数组

xiaoyong5854的博客 9335

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

(一)算法--查找算法顺序查找和二分查找(递归和非递归方式)

我们抛开二分查找算法,如果有这样的一个需求,需要在一些数字中找出有没有某个数字,我们应该怎么做?          1 首先我们会想到用什么数据结构存放这些数?          数据结构就是计算机存储组织、组织数据的方式。可以这样理解,生活中我们穿的衣服需要放到一个地方,衣服可以放到衣橱中,也可以放到行李箱中,也可以放到衣架中,这里的衣架、衣橱、和行李箱及是衣服的存放结构。所

Xinghf 8739

二分查找递归方式

 二分查找 算法思想:又叫折半查找,要求待查找的序列有序。每次取中间位置的值与待查关键字比较,如果中间位置的值比待查关键字大,则在前半部分循环这个查找的过程,如果中间位置的值比待查关键字小,则在后半部分循环这个查找的过程。直到查找到了为止,否则序列中没有待查的关键字。 二分查找又称折半查找,它是一种效率较高的查找方法。 折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃...

luzhensmart的专栏 1万+

总结一下递归与非递归的二分查找

首先介绍一下非递归的二分查找,肯定是要用一个循环了,比较注意的地方有一点就是循环的条件要记得带“=”号,一旦只是左边小于右边,那么那些当左右两边相等的时候算出来的点就会找不到,这挺好理解的不再多说,其他的就很简单没有什么特别的,下面是我的代码: int Binsearch(int a[], int n, int key){ int left = 0; int right = n - 1; while (left <= right){ int mid = (left + right) / 2;

qiexinyueaifei的博客 267

C语言(CED)查找最接近的元素(分治法/二分查找):在一个非降序列中,查找与给定值最接近的元素。(递归实现)

一、题目大意 查找最接近的元素(分治法/二分查找):在一个非降序列中,查找与给定值最接近的元素。 [输入] 第一行包含一个整数n,为非降序列长度。 第二行包含n个整数,为非降序列各元素。 第三行包含一个整数m,为要询问的给定值个数。1 <= m <= 10000。 接下来m行,每行一个整数,为要询问最接近元素的给定值。所有给定值的大小均在0-1,000,000,000之间 ...

Cat 1万+

Python 二分查找

本文章的所有代码和相关文章, 仅用于经验技术交流分享,禁止将相关技术应用到不正当途径,滥用技术产生的风险与本人无关。 本文章是自己学习的一些记录。 开始 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查

hijacklei的博客 4462

顺序查找与二分查找

基本查找

weixin_64443786的博客 310

顺序查找和二分查找(python)

文章目录顺序查找二分查找二分查找的递归代码 顺序查找 在python List中,数据项的存储位置称为下标(有序的整数),通过下标,我们就可以按照书序来访问和查找数据项,这就是顺序查找。 首先从列表中的第一个数据项开始 按照下标增长的顺序,逐个比对数据项; 如果到最后一个都未发现要查找的项,那么查找失败。 类似于穷举法,穷尽所有肯能。 def list_search(alist, target): pos = 0 found = False while pos < l

suwuzs的博客 1402
上一篇: 顺序(线性)查找
下一篇: 插值查找(运用递归,类似于二分查找)
大哥的叔
博客等级 码龄8年 72粉丝 295原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值