算法(Java实现)—— 二分搜索算法
二分搜索算法
有序数列才可用二分查找算法
思路分析
思路分析
首先确定该数组的中间下标mid = (left + right)/ 2
然后让需要查找的数findVal和arr【mid】比较
findVal > arr[mid],向右查询
findVal < arr[mid],向右查询
findVal == arr[mid],找到,返回
结束递归的条件
找到就结束
递归完整个数组,未找到,结束递归,left > right
二分查找递归算法
基本写法
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;
}
}
新需求
当一个数组中有多个相同的数值是 ,将所有数值都查到
代码实现
package com.why.search;
import com.sun.jdi.PathSearchingVirtualMachine;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.ListIterator;
import java.util.logging.Level;
/**
* @Description TODO 当一个数组中有多个相同的数值是 ,将所有数值都查到,使用二分查找
* @Author why
* @Date 2020/11/1 16:35
* Version 1.0
**/
public class NewBinarySearch {
public static void main(String[] args) {
int[] arr = {1,8,8,10,10,10,10,11};
List res = newBinarySearch(arr, 0, arr.length - 1, 8);
if (!res.isEmpty()){
System.out.println(res);
}else {
System.out.println("未找到");
}
}
/**
* 二分查找查找多条数据
*
* 思路:
* 找到mid值时,不要马上返回
* 向mid 索引值的左边扫描将所有满足查找值的元素下标加入到集合
* 向右扫描将所有满足查找值的元素下标加入到集合
* @param arr
* @param left
* @param right
* @param findVal
* @return
*/
public static List<Integer> newBinarySearch(int[] arr, int left, int right, int findVal){
if (left > right){
return new ArrayList<Integer>();
}
int mid = (left + right) / 2;
int midVal = arr[mid];
if (findVal > midVal){
return newBinarySearch(arr,mid + 1,right,findVal);
}else if (findVal < midVal){
return newBinarySearch(arr,left,mid - 1,findVal);
}else {
List<Integer> resIndexList = new ArrayList<>();
//向左边扫描
int temp = mid - 1;
while (true){
if (temp < 0 || arr[temp] != findVal){
break;
}
resIndexList.add(temp);
temp -= 1;
}
//中间值
resIndexList.add(mid);
//向右扫描
temp = mid + 1;
while (true){
if (temp > arr.length || arr[temp] != findVal){
break;
}
resIndexList.add(temp);
temp += 1;
}
return resIndexList;
}
}
}
二分查找非递归算法
需求
数组{1,3,8,10,11,67,100},编程实现二分查找,以非递归形式完成
代码实现
package whyAlgorithm.binaryseaech;
import jdk.swing.interop.LightweightFrameWrapper;
/**
* @Description TODO 二分查找非递归形式
* @Author why
* @Date 2020/12/9 19:53
* Version 1.0
**/
public class BinarySearchNoRecursion {
public static void main(String[] args) {
int[] arr = {1,3,8,10,11,67,100};
int target = binarySearch(arr,10);
System.out.println("下标:" + target);
System.out.println(arr[target]);
}
/**
* 二分查找非递归算法
* @param arr 数组,升序排列
* @param target 需要查找的算法
* @return 返回数组下标
*/
public static int binarySearch(int[] arr,int target){
int left = 0;
int right = arr.length - 1;
while (left <= right){//查找
int mid = (left + right)/2;
if (arr[mid] == target){//找到中间数
return mid;
}else if (arr[mid] > target){//大于向左查找
right = mid - 1;
}else {//小于向右查找
left = mid + 1;
}
}
return -1;
}
}
算法(Java实现)—— 二分搜索算法的更多相关文章
- 二分查找算法java实现
今天看了一下JDK里面的二分法是实现,觉得有点小问题.二分法的实现有多种今天就给大家分享两种.一种是递归方式的,一种是非递归方式的.先来看看一些基础的东西. 1.算法概念. 二分查找算法也称为折半搜索 ...
- 1月21日 Reference Data Type 数据类型,算法基础说明,二分搜索算法。(课程内容)
Reference Datat Types 引用参考数据类型 -> 组合数据类型 Array, Hash和程序员自定义的复合资料类型 组合数据的修改: 组合数据类型的变量,不是直接存值,而是存一 ...
- 数据结构与算法 java描述 第一章 算法及其复杂度
目录 数据结构与算法 java描述 笔记 第一章 算法及其复杂度 算法的定义 算法性能的分析与评价 问题规模.运行时间及时间复杂度 渐进复杂度 大 O 记号 大Ω记号 Θ记号 空间复杂度 算法复杂度及 ...
- 归并排序算法 java 实现
归并排序算法 java 实现 可视化对比十多种排序算法(C#版) [直观学习排序算法] 视觉直观感受若干常用排序算法 算法概念 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Di ...
- 快速排序算法 java 实现
快速排序算法 java 实现 快速排序算法Java实现 白话经典算法系列之六 快速排序 快速搞定 各种排序算法的分析及java实现 算法概念 快速排序是C.R.A.Hoare于1962年提出的一种划分 ...
- 堆排序算法 java 实现
堆排序算法 java 实现 白话经典算法系列之七 堆与堆排序 Java排序算法(三):堆排序 算法概念 堆排序(HeapSort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,可以利用数组的特 ...
- Atitit 电子商务订单号码算法(java c# php js 微信
Atitit 电子商务订单号码算法(java c# php js 微信 1.1. Js版本的居然钱三爷里面没有..只好自己实现了. 1.2. 订单号标准化...长度16位 1.3. 订单号的结构 前 ...
- 无向图的最短路径算法JAVA实现
一,问题描述 给出一个无向图,指定无向图中某个顶点作为源点.求出图中所有顶点到源点的最短路径. 无向图的最短路径其实是源点到该顶点的最少边的数目. 本文假设图的信息保存在文件中,通过读取文件来构造图. ...
- 无向图的最短路径算法JAVA实现(转)
一,问题描述 给出一个无向图,指定无向图中某个顶点作为源点.求出图中所有顶点到源点的最短路径. 无向图的最短路径其实是源点到该顶点的最少边的数目. 本文假设图的信息保存在文件中,通过读取文件来构造图. ...
随机推荐
- 在 macOS 中使用 Podman
原文链接:https://fuckcloudnative.io/posts/use-podman-in-macos/ Podman 是一个无守护程序与 Docker 命令兼容的下一代 Linux 容器 ...
- 基于物联网的O2O养猪平台
引言:随着生活水平的提高,人们会越来越重视食品安全问题.在城市里的人想养头猪,并想看着它快快乐乐长大.但是无奈于自己没时间和精力.而农户想养猪,可能又缺少启动资金,且不能承担大的风险.这时候我的美团式 ...
- get_object_vars
get_object_vars()
- 在Jenkins的帮助下让我们的应用CI与CD
上图三位大家应该很熟悉吧,借助这三者可以让我们的服务在Linux环境下持续集成.容器中持续部署. 本篇博客的项目是core webapi, .NET 5.0 在11号已经正式发布了,你们的项目都升级了 ...
- open()和with open() as的区别
2020-03-18 20:37:55 open()和with open() as的区别 1 file = open("test.txt","r") 2 fo ...
- 编曲技巧:使用FL Studio来制作停顿的效果
停顿效果是一种在音乐创作中非常常用的音效,它能起到缓冲的作用,而且能使这段旋律更具节奏感,在比较激情的歌曲中尤为常见.例如知名歌手王力宏演唱的<火力全开>中就使用了停顿效果,为歌曲加了不少 ...
- 避开一部分安装问题的Burpsuite的安装教程
Burpsuite的安装教程 前言: 既然网上有很多的Burpsuite的安装教程为什么笔者还要在写这篇文章呢? 笔者发现网上的许多安装教程都存在着许许多多的问题,有时候对于一些安装细节描述不是很深, ...
- nodejs事件和事件循环简介
目录 简介 事件 事件循环 事件循环的阻塞 事件循环举例 栈和消息队列 作业队列和promise process.nextTick() setImmediate() setInterval() 简介 ...
- moviepy音视频剪辑:AudioClip的max_volume方法报TypeError: bad operand type for abs(): ‘list‘错
☞ ░ 前往老猿Python博文目录 ░ 一.环境 操作系统:win7 64位 moviepy:1.0.3 numpy:1.19.0 Python:3.7.2 二.应用代码及报错信息 应用代码 imp ...
- 第3章 Python的数据类型 第3.1节 功能强大的 Python序列概述
一.概述 序列是Python中最基本的数据结构,C语言中没有这样的数据类型,只有数组有点类似,但序列跟数组差异比较大. 序列的典型特征如下: 序列使用索引来获取元素,这种索引方式适用于所有序列: 序列 ...