二分查找法与我们在孩童时期玩过的猜数的游戏一样,这个游戏里一个朋友会让你猜他正想的一个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. Codevs 1009 产生数

    题目描述 Description 给出一个整数 n(n<10^30) 和 k 个变换规则(k<=15). 规则: 一位数可变换成另一个一位数: 规则的右部不能为零. 例如:n=234.有规 ...

  2. 合并大量txt文件的内容

    首先熟悉一个dos命令 显示文件内容命令——type命令 1.格式:type [盘符:] [路径] 文件名 2.类型:内部命令 3.功能:把指定的文件内容在屏幕上显示或打印机输出,它常用作查阅和显示文 ...

  3. struct和class区别

    转载来源:http://blog.sina.com.cn/s/blog_48f587a80100k630.html C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据 ...

  4. RGB颜色二值化

    原理:RGB颜色根据计算'灰度'的公式,可以转化为黑白2种颜色,实现二值化. 业务场景的应用:可以根据背景颜色,取一个黑色或白色的颜色,作为背景色上的文案字体颜色 具体代码: function get ...

  5. mysql在windows下支持表名大小写,lower_case_table_names

    windows下mysql默认是不支表名大小写的,也就是表名大小写不敏感.用phpmyadmin创建的驼峰式表名,全部被强制成小写.mysql表名大小写敏感的参数: lower_case_table_ ...

  6. ThreadLocal模式探索

    一.首先,ThreadLocal模式使共享数据能多个线程被访问,每个线程访问的只是这个数据的副本,线程之间互不影响. 例子1: package Thread2; public class Counte ...

  7. Spark菜鸟学习营Day3 RDD编程进阶

    Spark菜鸟学习营Day3 RDD编程进阶 RDD代码简化 对于昨天练习的代码,我们可以从几个方面来简化: 使用fluent风格写法,可以减少对于中间变量的定义. 使用lambda表示式来替换对象写 ...

  8. python杂记-5(装饰器)

    1.被装饰的函数有参数(一个参数): def w1(func): def inner(arg): # 验证1 # 验证2 # 验证3 return func(arg) return inner @w1 ...

  9. 使用virtualenv或zc.buildout创建Python-tornado分离环境

    originally created by shuliang under CC BY-NC-ND 3.0 license 一.引言 学习编程,好比练功,总得先有个环境,搭台子是必须的.为了照顾初学者, ...

  10. 简单的优化处理 By LINQ TO SQL

    最近在做关于新浪微博授权的一些minisite,数据库并不复杂,所以在数据打交道这块采用了linqtosql,开发起来更快更简单...但是随着用户访问逐渐增多,用户上传的图片也越来越多,因为首页是一个 ...