Java编程内功-数据结构与算法「二分查找非递归」
时间:2025-11-05 16:01:52 出处:IT科技阅读(143)
基本介绍
1.二分查找只适用于从有序的编程数列中进行查找(比如数字和字母),将数列排序后再进行查找。内功
2.二分查找法的数据算法运行时间为对数时间O(log2n),即查找到需要的目标位置最多只需log2n步,假设从[0,结构99]的队列中寻找目标数30,则需要查找步数为log2(100),分查即最多需要7次(2^6<100<2^7)。找非
代码案例
package com.xie.algorithm; public class BinarySearchNoRecur { public static void main(String[] args) { int[] arr = {1,递归 3, 8, 10, 11, 67, 100}; int index = binarySearch(arr, 1); System.out.println("index = " + index); } /** * 二分查找非递归实现 * * @param arr 待查找的数组,arr是升序排列 * @param target 需要查找的数 * @return 返回对应的下标 ,-1 表示没有找到 */ 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; } }基本介绍
1.插值查找算法类似于二分查找,网站模板不同的内功是插值查找每次从自适应的mid处开始查找。
2.二分查找中求mid索引的数据算法公式转成插值查找mid索引公式,low表示左边的结构索引,high表示右边的分查索引,key表示要查找的找非值

代码案例
package com.xie.search; import java.util.ArrayList; import java.util.List; public class InsertValueSearch { static int count = 0; public static void main(String[] args) { int[] arr = new int[102]; arr[0] = 1; arr[1] = 1; for (int i = 2; i < 102; i++) { arr[i] = i; } List<Integer> indexList = insertValueSearch(arr, 0, arr.length - 1, 1); System.out.println("indexList = " + indexList); System.out.println("查找次数:" + count); /* indexList = [1, 0] 查找次数:1 */ } /** * 插值查找,返回索引集合 * * @param arr 数组 * @param left 左边索引 * @param right 右边索引 * @param findValue 要查找的递归值 * @return 找到就返回所有索引的集合,香港云服务器没有就返回空 */ public static List<Integer> insertValueSearch(int[] arr,编程 int left, int right, int findValue) { count++; List<Integer> indexList = new ArrayList<Integer>(); //注意:findValue < arr[0] || findValue > arr[arr.length - 1] 这个必须要,否则mid可能越界 if (left > right || findValue < arr[0] || findValue > arr[arr.length - 1]) { return new ArrayList<Integer>(); } int mid = left + (right - left) * (findValue - arr[left]) / (arr[right] - arr[left]); int midValue = arr[mid]; if (findValue > midValue) { return insertValueSearch(arr, mid + 1, right, findValue); } else if (findValue < midValue) { return insertValueSearch(arr, left, mid - 1, findValue); } else { //如果找到了,再向左扫描,将满足条件的加入indexList int temp = mid - 1; while (true) { if (temp < 0 || arr[temp] != findValue) { break; } indexList.add(temp); temp--; } //再向右扫描,将满足条件的加入indexList temp = mid + 1; while (true) { if (temp > right || arr[temp] != findValue) { break; } indexList.add(temp); temp++; } indexList.add(mid); return indexList; } } }注意事项
对于数据量大,关键字分布比较均匀的查找表来说,采用插值查找,速度较快。 关键字分布不均匀的情况下,该方法不一定比二分法要好。
分享到:
温馨提示:以上内容和图片整理于网络,仅供参考,希望对您有帮助!如有侵权行为请联系删除!
猜你喜欢
- 特斯拉Model3(颠覆传统,引领未来)
- Glibc 安全补丁引起更严重的漏洞
- SQL server组合查询+sql常用函数有哪些?
- Twitter放弃Cassandra数据库系统存储数据
- 乐视玩游戏(全方位娱乐享受,乐视让你游戏更爽!)
- SQL Server业务规则的链接技术之探讨
- 微软Office Word远程代码执行漏洞|CVE-2021-40444
- SQL Server 2000之设备激活错误的解析
- ubuntu安装了wine qq怎么去卸载呢?下面我们分别来演示如何卸载它们1、安装wine按ctrl+alter+T打开终端输入以下两条命令sudo apt-get updatesodo apt-get install wine安装时间有点长,请耐心的等候2、按钮选择期间有个软件包的配置图像界面,需要用户使用tab键选定ok然后下一个条出另一个框,这里移动左右键盘,选择YES。按下enter键进行安装、、、、、3、安装wine-qq下载wine-qq的网址:http://www.longene.org/download/sudo dpkg -i WineQQ2013-xxx(你下载的QQ web包)4、卸载wine-qqsudo dpkg --purge wine-qq2012-longeneteam
