二分查找法与我们在孩童时期玩过的猜数的游戏一样,这个游戏里一个朋友会让你猜他正想的一个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. Python实现Linux下文件查找

    import os, sys def search(curpath, s): L = os.listdir(curpath) #列出当前目录下所有文件 for subpath in L: #遍历当前目 ...

  2. iOS相机操作笔记

    最近忙于项目,需要拍摄图片,这里先列出部分测试代码. // // FirstViewController.m // UiTest // // Created by Tang Huaming on 16 ...

  3. mongodb在ubuntu下的couldn‘t remove fs lock errno:9 Bad file descriptor的错误

    按照官网上的安装方法: 在ubuntu系统下有可能出现如下错误: couldn't remove fs lock errno:9 Bad file descriptor 此时需要修改文件所有者 $ s ...

  4. 51nod1270 数组的最大代价(简单dp)

    ---恢复内容开始--- 1270 数组的最大代价 题目来源: HackerRank 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 数组A包含N个 ...

  5. Flash Activex NPAPI PPAPI 各种网页插件完整安装包下载地址

    内容全部是自己手工原创写作的参考内容,完全排除从其他网站COPY的内容信息.如有雷同实属巧合.   奉献给有需求的人士,也给各位解决FLASH安装头疼的问题,正常在线下载安装运气不好的安装半天.运气好 ...

  6. Oracle 动态视图5 V$SESSION_LONGOPS

    一.视图V$SESSION_LONGOPS显示运行超过6秒的操作的状态.包括备份,恢复,统计信息收集,查询等等 Column Datatype Description SID NUMBER Sessi ...

  7. Oracle varchar2 4000

    关于oracle varchar2 官方文档的描述 VARCHAR2 Data Type The VARCHAR2 data type specifies a variable-length char ...

  8. 用Python作GIS之二:STARS开发环境配置

    STARS的一般使用可以通过REGAL网页快速学习http://regionalanalysislab.org/?n=STARS再次不做详细介绍这里关注的主题是对STARS源代码分析即为使用Pytho ...

  9. ORA-15221: ASM operation requires compatible.asm of 11.2.0.0.0 or higher

    昨天在做存储迁移的时候,对ASM磁盘组的东西进行操作时,出现了如标题的错误.经查资料,发现原因如下:     如磁盘组是使用asmca图形化工具创建,则compatible.asm默认设置就已经为11 ...

  10. 动画(Animation) 之 (闪烁、左右摇摆、上下晃动等效果)

    左右晃动的效果: (这边显示没那么流畅) 一.续播  (不知道取什么名字好,就是先播放动画A, 接着播放动画B) 有两种方式. 第一种,分别动画两个动画,A和B, 然后先播放动画A,设置A 的 Ani ...