一、查找思想

折半查找 也称为二分查找,是一种效率较高的查找方法,查找时要求表中的节点按关键字的大小排序,并且要求线性表顺序存储。

  1. 首先用要查找的关键字值(key)与中间位置结点的关键字值(arr[mid])相比较;
  2. 若比较结果相等,则查找完成;若不相等,再根据要查找的关键字值(key)与该中结点关键值(mid)的大小来确定下一步在那个子表中进行;
  3. 若待查关键值大于中间结点的关键字值(key > arr[mid])),则应查找中间结点以后的字表,否则(key < arr[mid])),查找中间结点以前的字表;
  4. 重复步骤1~3,直到找到满足条件的结点,或者明确表中没有这样的结点。

二、图解

假设用变量 low 和 high 分别存储待查元素所在范围的下界和上界,变量 mid 存储区间的中间位置,即 mid = [(low + high) / 2]。

三、代码实现

public class BinarySearch {
public static void main(String[] args) {
int[] arr = {6, 12, 33, 87, 90, 97, 108, 561}; System.out.println(binarySearch(arr, 90));
//递归查找
System.out.println(binarySearch(arr, 0, arr.length - 1, 90));
} /**
* @param arr 待排序列
* @param key 待查找值
* @return 待查找值在待排序列中的位置
*/
private static String binarySearch(int[] arr, int key) {
int low = 0;
int high = arr.length - 1; while (low <= high) { //必须为 '<=' 否则无法匹配到指定的key;
int mid = (low + high) / 2; if (arr[mid] == key) {
return "Successful matching [" + (mid + 1) + "]";
} else if (arr[mid] > key) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return "Successful matching -1";
} /**
* 递归实现二分查找
* @param arr 待排序列
* @param start 待排序列开始值
* @param end 待排序列结束值
* @param key 待查找值
* @return 待查找值在待排序列中的位置
*/
private static int binarySearch(int[] arr, int start, int end, int key) { if (key < arr[start] || key > arr[end] || start > end) { //start > end 不能为'>='
return -1;
} int mid = (start + end) / 2;
if (key > arr[mid]) {
return binarySearch(arr, mid + 1, end, key);
} else if (key < arr[mid]) {
return binarySearch(arr, start, mid - 1, key);
} else {
return mid + 1;
}
}
}

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

  1. Java 实现折半查找

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. [转]编程珠玑第五章二分搜索(折半查找)之java实现

    http://blog.csdn.net/hwe_xc/article/details/51813080 二分搜索又称为折半查找,用来高效快速的解决如下问题: 我们需要确定排序后的数组x[0..n-1 ...

随机推荐

  1. loj#6437. 「PKUSC2018」PKUSC(计算几何)

    题面 传送门 题解 计算几何的东西我好像都已经忘光了-- 首先我们可以把原问题转化为另一个等价的问题:对于每一个敌人,我们以原点为圆心,画一个经过该点的圆,把这个圆在多边形内部的圆弧的度数加入答案.求 ...

  2. P2407 [SDOI2009]地图复原

    $ \color{#0066ff}{ 题目描述 }$ 很久以前,有一个传说中的"EWF"部族,他们世代生活在一个N×M的矩形大地上.虽然,生活的地区有高山.有沼泽,但通过勤劳勇敢, ...

  3. 校园网络安全CTF 第一题 和 你真了解我吗?

    第一题: 需要先找到相应头(REsponse header中的tips) <?php$flag = "***";if (isset($_GET['repo']))//检测变量 ...

  4. kotlin 注意的地方

    1 . kotlin let 用法: let(val -> ) 注意:这  -> 后面不能有 花括号!!!! 2 . kotlin 中 如果使用了 @Transactional 注解.请让 ...

  5. BZOJ 5421: 收藏家

    传送门 直接搞很复杂,考虑转化问题 题目只要求第1个人最多能获得的物品数量 所以如果一种物品拥有多个和一个是没区别的 那么考虑每种物品对第1个人怎样贡献 显然要经过一些交换最终到达第一个人那里 发现很 ...

  6. 01背包----简单DP

    描述 且说上一周的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励的时刻了! 小Ho现在手上有M张奖券,而奖品区有N件奖品,分别标号为1到N,其中第i件奖品需要ne ...

  7. .net mvc 用jquery ajax成功后页面跳转。

    $.ajax({ //url: 'http://192.168.0.102/webApiDemo/api/WebApiTest/PostStudentInforOnePara', //url: &qu ...

  8. jQuery随笔-自定义属性获取+tooltip

    1.Jquery自定义属性获取 1) 通过自定义属性值获取document console.log($('[data-id='+item_id+']',listWrap)); $('[data-id= ...

  9. Android应用中添加Log4j的示例

    [2016-06-30]最新的log4j已经集成在DR_support_lib库中 具体请看: https://coding.net/u/wrcold520/p/DR_support_lib/git/ ...

  10. Percona Mysql备份

    介绍 Percona是唯一一款开源.免费的mysql热备份工具,实现了对InnoDB数据库的非阻塞式的备份.有如下优势:1.完整.快速.可靠的备份2.备份期间不打断事务执行(innodb引擎)3.备份 ...