java数组之二分法查找
认识:
猜字游戏
步数 | 所猜的数 | 结果 | 可能值的范围 |
0 | 1~100 | ||
1 | 50 | 太高 | 1~49 |
2 | 25 | 太低 | 26~49 |
3 | 37 | 太高 | 26~36 |
4 | 31 | 太低 | 32~36 |
5 | 34 | 太高 | 32~33 |
6 | 32 | 太低 | 33~33 |
7 | 33 | 正确 |
二分法要求:
有序数列
有序数组的java代码:
- package com.test;
- /**
- * 二分查找
- * @author jingxin
- *
- */
- public class Test {
- public static void main(String[] args) {
- OrdArray array = new OrdArray(5);
- array.insert(21);
- array.insert(1);
- array.insert(3);
- array.insert(4);
- array.insert(10);
- array.display();
- int i = array.find(3);
- System.out.println("二分查找:"+i);
- array.delete(1);
- array.display();
- }
- }
- class OrdArray{
- private long[] a; //数组
- private int nElems; //数组下标
- public OrdArray(int max){
- a = new long[max]; //初始化数组
- nElems = 0;
- }
- /**
- * 返回数组的长度
- * @return
- */
- public int size(){
- return nElems;
- }
- /**
- * 二分查找
- * @param searchKey 待查找的数
- * @return
- */
- public int find(long searchKey){
- int lowerBound = 0; // 二分起始下标
- int upperBound = nElems -1; // 二分终点下标
- int curIn; // 二分对半下标
- while(true){
//对于偶数个数据项,中间值只取整数,不影响查找结果
curIn = (lowerBound + upperBound)/2;- if(a[curIn] == searchKey){
- return curIn; // 找到了
- } else if(lowerBound > upperBound){
- return nElems; // 找不到返回元素个数
- } else{
- if(a[curIn] < searchKey){
- lowerBound = curIn + 1;
- } else{
- upperBound = curIn - 1;
- }
- }
- }
- }
- /**
- * 升序添加数组元素
- * @param value
- */
- public void insert(int value){
- int i;
- for (i = 0; i < nElems; i++) {
- if(a[i] > value){ // 线性查找,i存放符合条件的顺序元素
- break;
- }
- }
- for (int k = nElems; k>i; k--) { // 移动较大的数往上移
- a[k] = a[k-1];
- }
- a[i] = value;
- nElems++;
- }
- /**
- * 删除数组元素
- * @param value
- * @return
- */
- public boolean delete(long value){
- int i = find(value);
- // eg:5个数则,nElems=5,而i只能是0~4
- if(i == nElems){
- return false; // 该元素不存在
- } else{
- for (int k = i; k < nElems-1; k++) { // 将更大的数往下移
- a[k] = a[k+1];
- }
- nElems--;
- return true;
- }
- }
- /**
- * 查看数组
- */
- public void display(){
- for (int i = 0; i < nElems; i++) {
- System.out.print(a[i]+ " ");
- }
- System.out.println("");
- }
- }
二分查找所需的比较次数对照表:
范围 | 所需比较次数 | 该次数能查找的最大范围 |
10 | 4 | 16=2^4 |
100 | 7 | 128=2^7 |
1千 | 10 | 1024=2^10 |
1万 | 14 | 2^14 |
10万 | 17 | 2^17 |
100万 | 20 | 2^20 |
1000万 | 24 | 2^24 |
1亿 | 27 | 2^27 |
java数组之二分法查找的更多相关文章
- Java基础(50):二分法查找的非递归实现和递归实现(完整代码可运行,参考VisualGO理解更佳)
一.概念 二分查找算法也称折半查找,是一种在有序数组中查找某一特定元素的搜索算法. 二.算法思想 搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束:如果某一特定元素大于或者 ...
- Java冒泡排序与二分法查找的代码随笔
package javafirst; import java.util.Arrays; class MaoPao{ //升序排列 /** * @param arr 要排序的数组 * @return i ...
- java数组回顾---线性查找最大值最小值---二分查找
import java.util.Scanner; public class ArrayDemo { public static void main(String []args) { //------ ...
- java数组之binarySearch查找
/** * 1.如果找到目标对象则返回<code>[公式:-插入点-1]</code> * 插入点:第一个大与查找对象的元素在数组中的位置,如果数组中的所有元素都小于要查找的对 ...
- java基础之二分法查找
package p1; import java.util.*; public class Sortdob { public static void BubbleSort(int[] arr) { ...
- Java数组之二分查找
简单的二分查找 package com.kangkang.array; public class demo03 { public static void main(String[] args) { / ...
- C# -- 二分法查找
二分法查找:适用于已经排序好的数组 1.二分法查找(入门案例) static void Main(string[] args) { , , , , , , , , , , , , , , , , , ...
- Java中数组二分法查找
算法:当数组的数据量很大适宜采用该方法.采用二分法查找时,数据需是有序不重复的,如果是无序的也可通过选择排序.冒泡排序等数组排序方法进行排序之后,就可以使用二分法查找. 基本思想:假设数据是按升序排序 ...
- java基础-数组的折半查找原理
java基础-数组的折半查找原理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 如果让你写一个数组的查找功能,需求如下:在一个数组中,找一个元素,是否存在于数组中, 如果存在就返回 ...
随机推荐
- Newtonsoft.Json解析json字符串和写json字符串
写: StringWriter sw = new StringWriter(); JsonWriter writer = new JsonWriter(sw); //如果报错则使用JsonWriter ...
- 在基于WCF开发的Web Service导出WSDL定义问题及自定义wsdl:port 名称
在契约优先的Web服务开发过程中,往往是先拿到WSDL服务定义,各家开发各自的服务实现或客户端,然后互相调用. 尽管Web Service的标准已经发布很多年,但各 ...
- 关于“.WriteLine()是否需要这么多重载”的笔记
在Stack Overflow上看到一个较热门的问题,作笔记于此. Console.WriteLine()有以下如此多的重载: public static void WriteLine(string ...
- jquery常用属性与方法
1..css( )给指定的样式设置样式值: 2..attr(attributeName,value) /.removeAttr(attributeName);给指定的属性设置值 / 清除所有匹配的元素 ...
- BOM DOM区别 来源
DOM 是为了操作文档出现的 API,document 是其的一个对象:BOM 是为了操作浏览器出现的 API,window 是其的一个对象. BOM是浏览器对象模型,DOM是文档对象模型,前者是对浏 ...
- vue-2.4.0-添加的新东东
组件内新增实现属性继承 VUE中一个比较令人烦恼的事情是属性只能从父组件传递给子组件.这也就意味着当你想向嵌套层级比较深组件数据传递,只能由父组件传递给子组件,子组件再传递给孙子组件...像下面这样 ...
- MotionEvent的getX(),getY()与getRawX(),getRawY()区别
在Android的View中getX getRawX获取的坐标是不一样的,只是相对比照的对象不一样而已. 1.在View中: getX()是表示Widget相对于自身左上角的x坐标,而getRawX ...
- 微软RPC技术学习小结
RPC,即Remote Procedure Call,远程过程调用,是进程间通信(IPC, Inter Process Communication)技术的一种.由于这项技术在自己所在项目(Window ...
- SAP CRM WebClient UI和Hybris backoffice UI开发的相同点
CRM WebClient和Hybris backoffice的UI开发都不需要开发人员手写原生的html代码. CRM WebClient UI 在CRM WebUI workbench里,开发人员 ...
- cesium 加载倾斜摄影模型(这里有一坑)
代码如下: // Construct the default list of terrain sources. var terrainModels = Cesium.createDefaultTerr ...