package althorgrim;
/**
* 1、必须采用顺序存储结果
* 2、关键字必须有序
* @author hanrk-2734
*
*/
public class TestBinarySearch {

public static int binarySearch(int a[],int goal){
int high=a.length-1;
int low=0;
while (low<=high) {
int middle=(low+high)/2;
if (a[middle]==goal) {
return middle;
}
else if (a[middle]>goal) {
high=middle-1;
}
else {
low=middle+1;
}
}
return -1;

}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] src = new int[] {1, 3, 5, 7, 8, 9};
System.out.println(binarySearch(src, 3));
}

}
O(1):直接寻址到

O(n):遍历n个元素

O(logn):随着元素增加,呈现指数关系

O(n2):增加一倍元素,时间增加4倍

折半查找的算法时间复杂度最好的情况是O(1),平均情况下是logn。

分析一下,折半查找的算法时间复杂度为什么是logn?

算法的时间复杂度取决于运算时间,折半查询中主要依赖while循环次数,那么while循环次数是多少?假设有16个元素的数组进行折半查询,查询元素13

如果是n个元素,那么就是:

可以得出 k=logn


public class Demo {

public static void main(String[] args) {
int[] array = new int[] {3,6,8,9,10,11,13,19,25};
//声明角标 最小 和 最大 角标 和折半角标
int min=0;
int max=array.length-1;
int mid=(max+min)/2;
//声明要查找的值
int key=13;
//循环查找 循环里肯定要折半的操作
//我现在已经 明确知道 循环什么时候停止
//使用 key 和 中间角标的值 比较 如果相等 循环停止

while(key!=array[mid]) {
if(key>array[mid]) {
min=mid+1;
}else if(key<array[max]){
max=mid-1;
}
//重复折半的操作
mid=(max+min)/2;

//如果数组中没有这个数 会造成死循环
//需要一个出口让程序停止
if(min>max) {

//这里说明 没找到这个数 需要停止循环
mid=-1;
break;
}
}System.out.println("坐标是:"+mid);

}

}

java实现折半查找的更多相关文章

  1. Java 实现折半查找

    package search; import java.util.*; /*折半查找要求线性表是有序的,假设递增 * 基本思路:R[low...high]是当前的查找区间,首先确定中间位置mid=(l ...

  2. 【转】Java实现折半查找(二分查找)的递归和非递归算法

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://wintys.blog.51cto.com/425414/94051 Java二分 ...

  3. java之折半查找

    //功能:二分查找import java.util.*; public class Demo1 { public static void main(String[] args) { int arr[] ...

  4. java基础-数组的折半查找原理

    java基础-数组的折半查找原理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 如果让你写一个数组的查找功能,需求如下:在一个数组中,找一个元素,是否存在于数组中, 如果存在就返回 ...

  5. 求中位数,O(n)的java实现【利用快速排序折半查找中位数】

    查找无序数组的中位数,要想时间复杂度为O(n)其实用计数排序就能很方便地实现,在此讨论使用快速排序进行定位的方法. 1.中位数定义 2.算法思想 3.Java代码实现 4.时间复杂度分析 5.附录 中 ...

  6. Java学习笔记day07_琐碎知识_水仙花数_ASCII码_冒泡排序_简单选择排序_折半查找

    琐碎知识: 水仙花数, ASCII码, 冒泡排序, 简单选择排序, 折半查找 1.水仙花数 每位数的平方的和等于本身. 如100到999之间的水仙花数满足: 个位的平方+十位的平方+百位的平方 = 本 ...

  7. 冒泡排序、选择排序、直接插入排序、快速排序、折半查找>从零开始学JAVA系列

    目录 冒泡排序.选择排序.直接插入排序 冒泡排序 选择排序 选择排序与冒泡排序的注意事项 小案例,使用选择排序完成对对象的排序 直接插入排序(插入排序) 快速排序(比较排序中效率最高的一种排序) 折半 ...

  8. 用 Java 写一个折半查找?

    折半查找,也称二分查找.二分搜索,是一种在有序数组中查找某一特定元素的搜索算法. 搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束:如果某一特定元素大于或者小于中间元素,则 ...

  9. 折半查找(java)(边学习边更新)

    ---恢复内容开始--- class ArrayTest3 { public static void main(String[] args) { //int [] arr=new int[]{54,4 ...

随机推荐

  1. Android自己定义处理崩溃异常

    用过安卓手机的用户以及安卓开发人员们会时长碰到程序异常退出的情况.普通用户遇到这样的情况,肯定非常恼火,甚至会骂一生垃圾软件,然后卸载掉.那么开发人员们在开发过程中遇到这样的情况给怎么办呢,当然,你不 ...

  2. Step by Step Do IOS Swift CoreData Simple Demo

    简单介绍 这篇文章记录了在 IOS 中使用 Swift 操作 CoreData 的一些基础性内容,因为缺乏文档,基本上都是自行实验的结果.错漏不可避免,还请谅解. 部分内容借鉴了 Tim Roadle ...

  3. POJ 1741 Tree 树的分治(点分治)

    题目大意:给出一颗无根树和每条边的权值,求出树上两个点之间距离<=k的点的对数. 思路:树的点分治.利用递归和求树的重心来解决这类问题.由于满足题意的点对一共仅仅有两种: 1.在以该节点的子树中 ...

  4. 42.angularJS自定义服务

    转自:https://www.cnblogs.com/best/tag/Angular/ 1. 你可以创建自定义服务,链接到你的模块中: <!DOCTYPE html> <html& ...

  5. [学习笔记]HTTP协议

    转自:www.cnblogs.com/li0803/archive/2008/11/03/1324746.html Author :Jeffrey 引言 HTTP是一个属于应用层的面向对象的协议,由于 ...

  6. ES6中includes、startsWith、endsWith

    es6新增includes:返回布尔值,表示是否找到字符串.startsWith:返回布尔值,表示字符串是否在源字符串的头部位置.endsWith:返回布尔值,表示参数字符串是否在源字符串尾部. va ...

  7. SQL--通过身份证号得到年龄的

    /* =======================================创 建 人:CuiYaChao创建日期:2017-08-16功能描述:通过身份证号来计算年龄单元名称: Fun_Ge ...

  8. RMAN备份脚本

      单机环境全备   export ORACLE_BASE=/oracle export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1 export ORA ...

  9. 鼠标点击textarea后,在光标后追加内容

    $("#insertMsg").on("click",function(){ //获取下拉选项框的值 var textFeildValue = $(" ...

  10. COGS——T2084. Asm.Def的基本算法

    http://cogs.pro/cogs/problem/problem.php?pid=2084 ★☆   输入文件:asm_algo.in   输出文件:asm_algo.out   简单对比时间 ...