java数据结构学习(一)之二分查找
二分查找法与我们在孩童时期玩过的猜数的游戏一样,这个游戏里一个朋友会让你猜他正想的一个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数据结构学习(一)之二分查找的更多相关文章
- [underscore源码学习]——`>>` 运算符和二分查找
这是一篇记录学习 underscore v0.0.5 的fragment,觉得有点意思,和大家分享一下. 先看_.sortedIndex的源码,它用来确定 obj 在 array中的位置(array升 ...
- 【学习记录】二分查找的C++实现,代码逐步优化
二分查找的思想很简单,它是针对于有序数组的,相当于数组(设为int a[N])排成一颗二叉平衡树(左子节点<=父节点<=右子节点),然后从根节点(对应数组下标a[N/2])开始判断,若值& ...
- 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现
本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是 ...
- 【Java数据结构学习笔记之二】Java数据结构与算法之队列(Queue)实现
本篇是数据结构与算法的第三篇,本篇我们将来了解一下知识点: 队列的抽象数据类型 顺序队列的设计与实现 链式队列的设计与实现 队列应用的简单举例 优先队列的设置与实现双链表实现 队列的抽象数据类型 ...
- 【Java数据结构学习笔记之一】线性表的存储结构及其代码实现
应用程序后在那个的数据大致有四种基本的逻辑结构: 集合:数据元素之间只有"同属于一个集合"的关系 线性结构:数据元素之间存在一个对一个的关系 树形结构:数据元素之间存在一个对多个关 ...
- 【Java数据结构学习笔记之三】Java数据结构与算法之队列(Queue)实现
本篇是数据结构与算法的第三篇,本篇我们将来了解一下知识点: 队列的抽象数据类型 顺序队列的设计与实现 链式队列的设计与实现 队列应用的简单举例 优先队列的设置与实现双链表实现 队列的抽象数据类型 ...
- python数据结构之树(二分查找树)
本篇学习笔记记录二叉查找树的定义以及用python实现数据结构增.删.查的操作. 二叉查找树(Binary Search Tree) 简称BST,又叫二叉排序树(Binary Sort Tree),是 ...
- Java实现递增数组的二分查找
package com.algorithm; import java.util.ArrayList;import java.util.List; /** * 类功能描述: * * @author Ba ...
- Java源码分析(1):二分查找 + 循环递归实现
源代码 源码地址 public static int binarySearch(int[] a, int key) { return binarySearch0(a, 0, a.length, key ...
随机推荐
- ZigBee安全相关
ZigBee安全由AES加密算法和CCM操作方式作为安全方案,广泛使用在ZigBee联盟的通信协议中.ZDO层负责安全策略和安全配置的管理. Technorati 标签: ZigBee 安全 2. 配 ...
- shiro错误No SecurityManager accessible to the calling code
Shire在Web.xml中shiroFilter的Mapping配置错误 org.apache.shiro.UnavailableSecurityManagerException: No Secur ...
- Debian--changelog
以前就研究过debian安装包的问题,当时也没有做相关方面的记录,当时也没有完全研究明白,现在重新研究下,现在写下我的一些笔记,等我研究明白了,我会整理出来,出个系列博客,有兴趣的同学,也可以去看E文 ...
- js 倒计时 倒计时60秒
<input type="button" id="btn" value="免费获取验证码" onclick="settime ...
- sql server 查询多个不关联表且对结果编号
1.除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图.内联函数.派生表.子查询和公用表表达式中无效. 解决方法:top 100 percent * 2.如何对查询结果编 ...
- hi,mongo!(1)
用了很多年的关系型数据库,想换一种思路,学习一下最近比较火的mongo数据库. 一.下载.安装mongo 下载地址:http://www.mongodb.org/downloads(官网) 官网的mo ...
- [react native] Error loading page
如上图显示的错误,解决方法如下: 在react native ios项目的info.plist文件中,新增一个属性. 在Info.plist中添加NSAppTransportSecurity类型Dic ...
- 跟着PHP100第一季学写一个CMS(11-20)
PS.刚发现IE并不兼容,有点悲剧 cms1.1密码处理 1.小知识:sha1($_answer) //加密为40位,不知道能不能破解 2.小知识:mysql_real_escape_string( ...
- Windows 下 Composer 与 Laravel 4 的安装
1.安装Composer Composer是PHP的依附经管对象之一,官方网站 http://getcomposer.org/ .它支撑多种安装体式格式,对于在win下做开辟的草来说,最便捷的体式格式 ...
- 系统中使用frameset和Iframe刷新页面session失效
问题:Asp.net中每次刷新页面,session中保存的只就丢失 原因: 1.有些杀毒软件会去扫描web.config文件 2.程序内部有让session丢失的代码,或服务器内存不足 3.程序有框架 ...