博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【查找算法】- 二分查找算法
阅读量:4147 次
发布时间:2019-05-25

本文共 3157 字,大约阅读时间需要 10 分钟。

文章目录

1 小案例

请对一个有序数组进行二分查找{1,8,10,89,1000,1234},输入一个数看看该数组是否存在此数,并且求出下标,如果没有就提示"没有这个数"。

2 二分查找算法的思路

在这里插入图片描述

二分查找的代码

说明:增加了找到所有的满足条件的元素下标:

课后思考题:{1,8,10,89,1000,1000,1234}当一个有序数组中,有多个相同的数值时,如何将所有的数值都查找到,比如这里的1000。

package com.sukang.search;import java.util.ArrayList;import java.util.List;/** * @description: *       二分查找算法 *       注意:使用二分查找的前提是该数组是有序的. * @author: sukang * @date: 2020-11-11 13:31 */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,1000);        //System.out.println("resIndex="+resIndex);        List
resIndexList = binarySearch2(arr, 0, arr.length - 1, 1000); System.out.println("resIndexList:" + resIndexList); } /** * @description: * 二分查找算法 * @param arr 数组 * @param left 左边的索引 * @param right 右边的索引 * @param findVal 要查找的值 * @return: int 如果找到就返回下标,如果没有找到,就返回-1 * @author: sukang * @date: 2020/11/11 13:39 */ public static int binarySearch(int[] arr, int left, int right, int findVal){ // 当 left > right 时, 说明递归整个数组,但是没有找到 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
binarySearch2(int[] arr, int left, int right, int findVal){ //当left > right时,说明递归整个数组,但是没有找到 if(left > right){ return new ArrayList
(); } 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{ List
resIndexlist = new ArrayList
(); //向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; } }}

运行结果

在这里插入图片描述

转载地址:http://flnti.baihongyu.com/

你可能感兴趣的文章
SIGCHLD信号与进程异步等待
查看>>
可重入函数与线程安全
查看>>
linux信号基本概念及如何产生信号
查看>>
linux:进程中信号的“3种状态 And 3张表”
查看>>
linux信号系列文终结篇:信号的捕捉(含mysleep的实现)
查看>>
C语言实现9-9乘法表
查看>>
C语言应用题——谁是凶手?
查看>>
C语言——确定某数比特位中1的个数并打印其32位比特数值
查看>>
C语言应用题——如何确定跳水排名
查看>>
C语言实现小游戏——三子棋(Three Peices Chess)
查看>>
使用gdb调试多进程与多线程程序
查看>>
linux:进程组&作业&会话—concept&distinction&contact
查看>>
linux:终端(Terminal)基本概念&终端登录过程详解
查看>>
linux:守护进程&模拟实现mydaemon
查看>>
linux:作业控制&作业规划进程crond
查看>>
用arp.sh脚本文件抓取局域网内所有主机的IP和MAC地址
查看>>
MAC协议之CRC校验码
查看>>
NAT&代理服务器技术调研
查看>>
XShell初体验—连接VMware虚拟机
查看>>
网络端口服务(PortsService)介绍
查看>>