Java 使用二分查找快速定位元素位置
转载请注明出处:
快速定位 一个有序数列中 某一个元素的位置;
共有三种思路:
第一种:使用 for 循环,匹配元素值 与循环变量的值是否相等,相等则循环变量时的 i 则为元素位置
第二种:使用 二分法 与递归,二分法为折半思想,通过递归折半,找到元素的位置
第三种:使用 二分发 与 while 循环,在while 循环中,以 元素值得 最大值与最小值关系,在while 循环中,通过二分法,不断修改 元素区间的最大值与最小值
实现:
第一种 for 循环的代码省略。
第二种,使用 二分法 与 递归 与 第三种实现方式如下:
package com.example.demo.lettcode; /**
* 使用二分查找,快速定位元素位置和是否存在
* 当使用二分查找时,必须保证是有序数列,只有有序数列才能进行大小的左右分边
*/
public class BinarySearch {
public static void main(String[] args) {
int arr[] = {1,3,4,5,6,7,8,12};
System.out.println(arr.length);
// 使用递归与二分法
int index = binarySearch(arr,4,0,arr.length-1);
System.out.println(index);
// 使用while 循环与二分法
int index2 = cycleFind(arr,4);
System.out.println(index2);
} /**
* 使用递归与二分法
* @param arr
* @param value
* @param start
* @param end
* @return
*/
public static int binarySearch(int[] arr, int value, int start, int end) {
//判断在有序列表中是否存在
if (value < arr[start] || value > arr[end] || start > end) {
return -1;
} int middle = (start + end) / 2;
int index = 0;
if (arr[middle] > value) {
//位于中间值得左边
index = binarySearch(arr, value, start, middle - 1);
} else if (arr[middle] < value) {
// 位于中间值得右边
index = binarySearch(arr, value,middle + 1, end ); } else {
return middle;
}
return index;
} /**
* 使用while循环与二分法
* @param arr
* @param value
* @return
*/
public static int cycleFind(int[] arr, int value) {
int low = 0;
int middle = 0;
int high = arr.length - 1; while (low <= high) {
middle = (low + high) / 2;
if (arr[middle] > value) {
high = middle - 1;
} else if (arr[middle] < value) {
low = middle + 1;
} else {
return middle;
}
}
return -1;
} }
分析:
使用递归方式时,递归的次数和深度都是log2 N,每次所需要的辅助空间都是常数级别的: 空间复杂度:O(log2N )
非递归方式时,空间复杂度为 O(1)
Java 使用二分查找快速定位元素位置的更多相关文章
- linux下编译make文件报错“/bin/bash^M: 坏的解释器,使用grep快速定位代码位置
一.linux下编译make文件报错“/bin/bash^M: 坏的解释器 参考文章:http://blog.csdn.net/liuqiyao_01/article/details/41542101 ...
- selenium定位元素位置-xpath
xpath定位元素位置: 1.定位父兄节点: <div> <span>我是span1标签</span> <a id="1" href=&q ...
- 【C++】使用find函数快速定位元素
当有了STL,你还在用遍历的土方法定位元素吗? 今天就来介绍一下,如何使用algorithm库里的find函数快速定位数组或向量中的元素. 首先当然要包含头文件: #include <algor ...
- java 实现二分查找法
/** * 二分查找又称折半查找,它是一种效率较高的查找方法. [二分查找要求]:1.必须采用顺序存储结构 2.必须按关键字大小有序排列. * @author Administrator * */ p ...
- Java实现二分查找算法
Java程序员总该玩点基本的算法. 1.前提:二分查找的前提是需要查找的数组必须是已排序的,我们这里的实现默认为升序 2.原理:将数组分为三部分,依次是中值(所谓的中值就是数组中间位置的那个值)前,中 ...
- 【15】-java实现二分查找
二分查找在面试中经常被遇到,这个方法十分优雅 介绍 二分查找可以解决(预排序数组的查找)问题:只要数组中包含T(即要查找的值),那么通过不断缩小包含T的范围,最终就可以找到它.一开始,范围覆盖整个数组 ...
- java 冒泡排序 二分查找 选择排序 插入排序
下面这个程序是先定义一个整型数组,然后将其中的元素反序赋值,再用冒泡排序进行排序以后用二分查找来查找其中是否有某个数,返回值为-1时表示这个数可能小于这个数组的最小值或大小这个数组的最大值,-2表示这 ...
- 手把手教你用java实现二分查找树及其相关操作
二分查找树(Binary Search Tree)的基本操作有搜索.求最大值.求最小值.求前继.求后继.插入及删除. 对二分查找树的进行基本操作所花费的时间与树的高度成比例.例如有n个节点的完全二叉树 ...
- Java算法 -- 二分查找
折半查找,要求待查找的序列有序.每次取中间位置的值与待查关键字比较,如果中间位置的值比待查关键字大,则在前半部分循环这个查找的过程,如果中间位置的值比待查关键字小,则在后半部分循环这个查找的过程.直到 ...
- Java之二分查找算法
算法说明:取中间位置的值与待查字比较.如果比待查字更大,则去列表的前半部分查找,如果比待查字小,则去列表的后半部分查找,直到找到这个待查字,或者返回没有找到这个待查字.其中给定的列表是从大到小排列的有 ...
随机推荐
- Scrapy自带的断点续爬JOB-DIR参数
参考官方文档:https://docs.scrapy.org/en/latest/topics/jobs.html?highlight=JOBDIR#jobs-pausing-and-resuming ...
- VsCode运行与freopen与快读
运行 g++ -o a a.cpp && ./a g++ b.cpp -o b && ./b g++ c.cpp -o c && ./c freopen ...
- adb shell getprop 获取系统属性
adb shell getprop 以华为p30为例: [gsm.default.apn]: [gsm.defaultpdpcontext.active]: true [gsm.dualcards.s ...
- 痞子衡嵌入式:简析i.MXRT1170 MECC64功能特点及其保护片内OCRAM1,2之道
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT1170 MECC64功能特点及其保护片内OCRAM1,2之道. ECC是 "Error Correcting C ...
- Python——第二章:字典(dictionary)以及 添、删、改、查
首先, 字典是以键值对的形式进行存储数据的,必须有键[key],有值[value] 字典的表示方式: {key:value, key2:value, key3:value} 举例: dic = {&q ...
- .NET周刊 【12月第3期 2023-12-24】
国内文章 CAP 8.0 版本发布通告 - CAP 7岁生日快乐! https://www.cnblogs.com/savorboard/p/cap-8-0.html 今天宣布CAP 8.0版本正式发 ...
- Bazel 如何生成 clangd/clang-tidy 所需的 compile_commands.json
VSCode 中如何使用 clang-tidy 安装 clangd 插件 禁用 ms-cpp 插件(VSCode 会自动提示有冲突) 生成 clangd 所需的 compile_commands.js ...
- [Python急救站]回文数的判断
回文数判断:回文数是指这个数颠倒后,与原数一致,如32223.12221等. 第一个程序是由用户输入,并判断是否是回文数. a = eval(input("请输入一个五位数")) ...
- 【Solve】InnerClass annotations are missing corresponding EnclosingMember annotations. Such InnerClass annotations are ignored
问题: 今天Android项目在build时出现了下面的警告: InnerClass annotations are missing corresponding EnclosingMember ann ...
- 在线编辑Word——插入内容控件
内容控件是可添加和自定义的以在模板.窗体和文档中使用的单个控件.Word中支持添加多种类型的控件用于不同文档的设计需求.本文,将通过在线编辑的方式展示如何在Word中插入内容控件,这里使用的在线编辑器 ...