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. 和同事合作开发,使用局域网 git创建本地仓库

    转自原文 和同事合作开发,使用局域网 git创建本地仓库 1.仓库 建一个空文件夹来做仓库,例如建为 cangku 1.1 cd 到 cangku目录下 创建远程仓库容器 mkdir  mycangk ...

  2. 【POJ 1845】 Sumdiv (整数唯分+约数和公式+二分等比数列前n项和+同余)

    [POJ 1845] Sumdiv 用的东西挺全 最主要通过这个题学了约数和公式跟二分求等比数列前n项和 另一种小优化的整数拆分  整数的唯一分解定理: 随意正整数都有且仅仅有一种方式写出其素因子的乘 ...

  3. MapReduce----K-均值聚类算法

    对于K-均值聚类算法MapReduce的过程理解例如以下: 如果有个Mapper,首先把数据集分为个子集,分布到个Mapper上,初始化..并同一时候广播到H个Mapper上. E步: 在第一台Map ...

  4. 编译并使用boost库(win7+boost1.63+vs2015+32位or 64位),超详细,boost于vs2017下编译(64/32bit)

    首先下载得到boost的最新版(目前最新版是1.63) 下载地址: http://www.boost.org   也可以从这里直接下载 http://download.csdn.net/detail/ ...

  5. matplotlib 可视化 —— 绘制常见图形

    0. 饼状图 plt.pie():Python数据可视化:饼状图 1. 三角形 描点连线,起点和终点相同 triangle1 = ((0, sqrt(3)/2), (1, 3*sqrt(3)/2), ...

  6. jzoj4196 二分图计数 解题报告(容斥原理)

    Description

  7. Persistence

    Most of the programs we have seen so far are transient in the sense that they run for a short time a ...

  8. 1893. [国家集训队2011]等差子序列(bitset)

    ★★   输入文件:nt2011_sequence.in   输出文件:nt2011_sequence.out   简单对比时间限制:0.3 s   内存限制:512 MB [试题来源] 2011中国 ...

  9. 200 from memory cache / from disk cache / 304 Not Modified 区别

    三者情况有什么区别和联系,什么情况下会发生200 from memory cache 或 200 from disk cache 或 304 Not Modified? 200 from memory ...

  10. Kubernetes1.5 集成dashboard

    Kubernetes1.5 集成dashboard 配置kubernetes的dashboard相对简单.同样的,只需要从源码中获取到dashboard-controller.yaml及dashboa ...