二分查找法与我们在孩童时期玩过的猜数的游戏一样,这个游戏里一个朋友会让你猜他正想的一个1至100的数,当你猜了一个数后,他会告诉你三种选择的一个:你猜的比她想的大,或小,或猜中了。为了能用最少的次数猜中,必须从50开始猜,如果她说你猜的太小,则推出那个数在51-100之间,所以下一次猜75((51+100)/2),如果她说有些大,那你就会在51-74之间才,下一次猜(51+74)/2=62。直到猜中她所给的数。

下面给出我们猜1-100的数,key为33的过程:

  

只需7次就可以猜中答案。下面我们给出二分查找的代码:

public class BinarySearch {
private long[] a;
private int nelems;
public BinarySearch(int max){
a = new long[max];
nelems = 0;
}
//返回数组的长度
public int size(){
return nelems;
}
/**
* 二分查找算法关键代码
* @return
*/
public int binarySearch(long searchKey){
int low = 0;
int high = nelems-1;
int curIn;
while(true){
curIn = (low + high)/2;//划分范围的点
if(a[curIn] == searchKey){//幸运判断,很幸运正好猜中
return curIn; //返回要猜的数的位置
}else if(low > high){//范围不存在
return nelems;//没找到,返回数组的长度
}else{
if(searchKey > a[curIn]){
low = curIn + 1;
}else{
high = curIn - 1;
}
}
}
} /**
*
* 在有序数组里面插入数
* @param args
*/
public void insertOrderArray(long value){
int i;
for(i=0;i<nelems;i++){//遍历有序数组里面的元素与插入的数进行比较
if(a[i] > value){//如果有序数组里面的某一个数比插入的数大,则结束遍历
break;
}
} //插入的位置i,及i后面到的元素都要向右移动,腾出一个插入位置
for(int k=nelems;k>i;k--){
a[k] = a[k-1];//a[10]=a[9],a[9] = a[8]插入点后面的都向右移动一个位置
}
a[i] = value;//移动后腾出位置插入要插入的数
nelems++;
}
/**
* 删除有序数组里面的数
*/
public boolean delete(long key){
int i = binarySearch(key);//返回找到的数字数组下标
if(i==nelems){
return false;
}else{
int j;
for(j=i;j<nelems;j++){
a[j] = a[j+1];//向前移动
}
nelems--;//数组长度减少
return true; }
}
/**
* 显示数组中的数
*/
public void display(){
System.out.println("***************");
for(int j=0;j<nelems;j++){
System.out.print(a[j]+" ");
System.out.print("");
}
}
public static void main(String[] args){
int maxSize = 100;
BinarySearch arr = new BinarySearch(maxSize);
arr.insertOrderArray(30);
arr.insertOrderArray(12);
arr.insertOrderArray(15);
arr.insertOrderArray(10);
arr.insertOrderArray(90);
arr.insertOrderArray(100);
arr.insertOrderArray(101);
arr.insertOrderArray(80);
System.out.println("##############");
arr.display();
long keySearch = 102;
if(arr.binarySearch(keySearch) != arr.size()){//上面返回值为没找到返回nelems长度
System.out.println("找到"+keySearch);
}else{
System.out.println("没有找到"+keySearch);
}
arr.delete(30);
arr.delete(100);
arr.display();
}
}

java数据结构学习(一)之二分查找的更多相关文章

  1. [underscore源码学习]——`>>` 运算符和二分查找

    这是一篇记录学习 underscore v0.0.5 的fragment,觉得有点意思,和大家分享一下. 先看_.sortedIndex的源码,它用来确定 obj 在 array中的位置(array升 ...

  2. 【学习记录】二分查找的C++实现,代码逐步优化

    二分查找的思想很简单,它是针对于有序数组的,相当于数组(设为int a[N])排成一颗二叉平衡树(左子节点<=父节点<=右子节点),然后从根节点(对应数组下标a[N/2])开始判断,若值& ...

  3. 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现

      本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型   栈是 ...

  4. 【Java数据结构学习笔记之二】Java数据结构与算法之队列(Queue)实现

      本篇是数据结构与算法的第三篇,本篇我们将来了解一下知识点: 队列的抽象数据类型 顺序队列的设计与实现 链式队列的设计与实现 队列应用的简单举例 优先队列的设置与实现双链表实现 队列的抽象数据类型 ...

  5. 【Java数据结构学习笔记之一】线性表的存储结构及其代码实现

    应用程序后在那个的数据大致有四种基本的逻辑结构: 集合:数据元素之间只有"同属于一个集合"的关系 线性结构:数据元素之间存在一个对一个的关系 树形结构:数据元素之间存在一个对多个关 ...

  6. 【Java数据结构学习笔记之三】Java数据结构与算法之队列(Queue)实现

      本篇是数据结构与算法的第三篇,本篇我们将来了解一下知识点: 队列的抽象数据类型 顺序队列的设计与实现 链式队列的设计与实现 队列应用的简单举例 优先队列的设置与实现双链表实现 队列的抽象数据类型 ...

  7. python数据结构之树(二分查找树)

    本篇学习笔记记录二叉查找树的定义以及用python实现数据结构增.删.查的操作. 二叉查找树(Binary Search Tree) 简称BST,又叫二叉排序树(Binary Sort Tree),是 ...

  8. Java实现递增数组的二分查找

    package com.algorithm; import java.util.ArrayList;import java.util.List; /** * 类功能描述: * * @author Ba ...

  9. Java源码分析(1):二分查找 + 循环递归实现

    源代码 源码地址 public static int binarySearch(int[] a, int key) { return binarySearch0(a, 0, a.length, key ...

随机推荐

  1. java基础-注解Annotation原理和用法

    在很多java代码中都可以看到诸如@Override.@Deprecated.@SuppressWarnings这样的字符,这些就是注解Annotation.注解最早在jdk5中被引入,现在已经成为j ...

  2. c++11: less的用法

    less主要是重载了operator()方法,用来比较lhs 和 rhs std::less::operator() bool operator()(const T &lhs, const T ...

  3. mvc涉及到input设置了disabled

    在做网站管理后台的用户修改功能时,由于当前用户修改个人信息时规定用户名不能修改,故使用了input标签的disabled属性,但是在提交数据后却发现用户名显示为空了.后来一查才知道input设置为di ...

  4. 关于promise对象的笔记

    1.promise对象是ECMAScript6的新特性,很多新的JS框架都有它的实现和应用 2.promise常用于异步调用(ajax)中 3.promise主要用于解决回调函数层层嵌套的写法 4.要 ...

  5. 解决DataSnap支持的Tcp长连接数受限的两种方法

    如何解决DataSnap支持的Tcp长连接数受限的问题? 方案一: 采用代理服务器方式,基本流程为: 1.客户先连接代理服务器:2.获取可用的服务器IP和端口:3.关闭与代理服务器之间的连接:4.建立 ...

  6. fast_recovery_area无剩余空间(ORA-19815)

    一.问题现象 --执行日志切换时,夯住 SQL ('/u01/oradata/oracle/redo04.log') size 50m; SQL> alter system switch log ...

  7. Perl 关于 use strict 的用法

    什么场合要用 use strict 当你的程序有一定的行数时,尤其是在一页放不下时,或者是你找不到发生错误的原因时. 为什么要用 use strict? 众多的原因之一是帮你寻找因为错误拼写造成的错误 ...

  8. jquery-easyui中datagrid扩展,隐藏显示表头功能

    今天,后台中需要新增一个功能,用户可以自由选择显示的列,之后保存到本地localStroage中.所以扩展了easyui中datagrid的onHeaderContextMenu方法. 使用方法: _ ...

  9. javascript 数组排序之 sort()

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...

  10. 【转】Eazfuscator.NET 3.3中混淆化需要注意的一些问题

    对于DLL,Eazfuscator.NET默认不会混淆化任何公共成员,因为类库的公共成员很有可能被外界调用,而对于EXE的程序集,所有类型都可能被混淆化.注意上面这句话有一个“可能”,因为Eazfus ...