Java 二分查找
Java著名,高效并且应用广泛的二分查找算法.
package 二分查找; import java.util.Arrays; public class BinarySearch { public static void main(String[] args) { int[] a = { 123, 423, 21, 321, 12, 341, 3213, 42 }; // The array must be orderly Arrays.sort(a); for(int x : a) { System.out.print(x+" "); } System.out.println(); int rank = rank(123, a); System.out.println(rank); } public static int rank(int key, int[] a) { int lo = 0; int hi = a.length - 1; while (lo <= hi) { // 被查找的键要么不存在,要么必然存在于a[lo...hi]之中. int mid = lo + (hi - lo) / 2; if (key < a[mid]) { // 如果key小于a数组的一半大小下标中的数据,那么就可以让最大下标hi减小范围至mid-1 hi = mid - 1; } else if (key > a[mid]) { // 如果key大于a数组下标的一半中的数据,那么最小下标从mid基础上+1 lo = mid + 1; } else { return mid; } } //不存在返回-1 return -1; } }
该算法是由静态方法rank()实现的,它接受一个整数键key和一个已经有序的int数组作为参数.如果该键存在于数组中则返回它的索引,否则返回-1.
算法使用两个变量lo和hi,并保证如果键key在数组中则它一定在a[lo...hi]中,然后方法进入一个循环,不断将数组的中间键(mid)和被查找的键比较.
如果被查找的键key等于a[mid],则返回mid;否则算法就将查找范围缩小一半,如果被查找的键key小于a[mid]就将最大下标lo缩减至mid-1(在数组左半边-1继续查找)
如果被查找的键key大于a[mid]就继续在右半边查找(lo最小下标升级为mid+1),算法找到被查找的键key或是查找范围为空时该过程结束.
二分查找之所以快是因为它只需检查很少几个条目(相对于数组的大小)就能够找到目标元素(或者确认目标元素不存在).
https://www.processon.com/view/link/5b2308e4e4b02539617ea55c <图示
将编程看作是一门艺术,而不单单是个技术。 敲打的英文字符是我的黑白琴键, 思维图纸画出的是我编写的五线谱。 当美妙的华章响起,现实通往二进制的大门即将被打开。低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
如何对网站用户进行实名认证
2016年国家网信办发布了《移动互联网应用程序信息服务管理规定》,明确了用户实名认证的要求;一是按照“后台实名、前台自愿”的原则,对注册用户进行真实身份信息认证;二是建立健全用户信息安全保护机制;三是建立健全信息内容审核管理机制,对发布违法违规信息内容的,视情采取警示、限制功能、暂停更新、关闭账号等处置措施;四是依法保障用户知情权和选择权;五是尊重和保护知识产权,不得制作、发布侵犯他人知识产权的应用程序;六是记录用户日志信息,并保存六十日。 对于目前主流的互联网系统实名认证方案有以下三种: 一、身份证实名认证 系统强制用户注册时填写个人的姓名和身份证号码,通调用第三方接口核验身份证号和姓名是否一致。这是一种较为简单的实名认证方式,很多验证是否是未成年人的系统多使用这种方案,因为身份证号码内含有出生日期。 发送数据: bodys.put("idNo", "340421190210182345"); bodys.put("name", "张三"); 返回数据: { "name": "张三", "idNo": "340421190710145412", "respMessage": "身份证...
- 下一篇
C# Winform制作虚拟键盘,支持中文
原文: C# Winform制作虚拟键盘,支持中文 最近在做一个虚拟键盘功能,代替鼠标键盘操作,效果如下: 实现思路: 1 构建中文-拼音 数据库,我用的是SQLite数据库,如 2 构建布局,如效果图 代码: 数据库代码文件 SqlHandler.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.SQLite; using System.Configuration; using System.IO; using System.Reflection; using System.Windows.Forms; namespace TestKeyBord { public class SqlHandler { public static void InitSQLite(string db,string table) { try { DbName = db; TableName = t...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Linux系统CentOS6、CentOS7手动修改IP地址
- Docker安装Oracle12C,快速搭建Oracle学习环境