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之二分查找算法
算法说明:取中间位置的值与待查字比较.如果比待查字更大,则去列表的前半部分查找,如果比待查字小,则去列表的后半部分查找,直到找到这个待查字,或者返回没有找到这个待查字.其中给定的列表是从大到小排列的有 ...
随机推荐
- 测试框架TestNG学习笔记
目录 一.TestNG的基本介绍和如何在maven中引用 二.TestNG基本注解与执行顺序实战 2.1 注解实战 @Test标签 2.2 注解实战 BeforeMethod和AfterMethod ...
- LR(0)分析法
LR(0)是一种自底向上的语法分析方法.两个基本动作是移进和规约. 具体例子如下 已知文法G[E] (1) E→aА (2) E→bB (3) A→cА (4) A→d (5) B→cB (6) B→ ...
- selenium之下拉菜单列表定位
下拉菜单列表定位>>使用Select类定位 from selenium.webdriver.support.ui import Select #导入Select类 select=Selec ...
- Ubuntu安装Maridb 10.5版本
以20.04版本为例 Ubutun20.04自带源默认安装的mariadb版本为10.3不符合安装zabbix6.0的要求 打开MariaDB的官方网站:https://mariadb.org/mar ...
- 2023-11-29:用go语言,给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。 需保证 返回结果的字典序最小。 要求不能打乱其他字符的相对位置)。 输入:s = “cba
2023-11-29:用go语言,给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次. 需保证 返回结果的字典序最小. 要求不能打乱其他字符的相对位置). 输入:s = &quo ...
- CodeForces 1307D BFS最短路 思维
原题链接 题意 给出一个简单无向图,边权全部为1,同时给我们k个特殊点,要求我们从这k个特殊点中选出两个来连一条边权为1的边.同时,我们的决策要保证1~n的最短路程最大,求最终这个最短路长度. 思路 ...
- vue获取公网ip
<template> <div> <div>Your Public IP: {{publicIP}}</div> </div> </t ...
- php +libcurl+nghttp2 实现高性能微服务架构
1.server端nginx编译时增加参数configure --with-http_v2_module server { listen 80 http2; ...
- 如何利用动态配置中心在JavaAgent中实现微服务的多样化治理
本文分享自华为云社区<如何利用动态配置中心在JavaAgent中实现微服务的多样化治理>,作者:华为云开源 . 一.前言 随着JavaAgent在微服务治理方面的广泛应用和发展,我们可以在 ...
- 5G多输入多输出技术,到底是个啥东东?
摘要:多输入多输出技术是指在发射端和接收端分别使用多个发射天线和接收天线,使信号通过发射端与接收端的多个天线传送和接收,从而改善通信质量. 本文作者|历天一 多输入多输出技术是指在发射端和接收端分别使 ...