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

Java二分查找实现,欢迎大家提出交流意见.
  1. /**
  2. *名称:BinarySearch
  3. *功能:实现了折半查找(二分查找)的递归和非递归算法.
  4. *说明:
  5. * 1、要求所查找的数组已有序,并且其中元素已实现Comparable<T>接口,如Integer、String等.
  6. * 2、非递归查找使用search();,递归查找使用searchRecursively();
  7. *
  8. *本程序仅供编程学习参考
  9. *
  10. *@author: Winty
  11. *@date: 2008-8-11
  12. *@email: wintys@gmail.com
  13. */
  14.  
  15. class BinarySearch<T extends Comparable<T>> {
  16. private T[] data;//要排序的数据
  17.  
  18. public BinarySearch(T[] data){
  19. this.data = data;
  20. }
  21.  
  22. public int search(T key){
  23. int low;
  24. int high;
  25. int mid;
  26.  
  27. if(data == null)
  28. return -1;
  29.  
  30. low = 0;
  31. high = data.length - 1;
  32.  
  33. while(low <= high){
  34. mid = (low + high) / 2;
  35. System.out.println("mid " + mid + " mid value:" + data[mid]);///
  36.  
  37. if(key.compareTo(data[mid]) < 0){
  38. high = mid - 1;
  39. }else if(key.compareTo(data[mid]) > 0){
  40. low = mid + 1;
  41. }else if(key.compareTo(data[mid]) == 0){
  42. return mid;
  43. }
  44. }
  45.  
  46. return -1;
  47. }
  48.  
  49. private int doSearchRecursively(int low , int high , T key){
  50. int mid;
  51. int result;
  52.  
  53. if(low <= high){
  54. mid = (low + high) / 2;
  55. result = key.compareTo(data[mid]);
  56. System.out.println("mid " + mid + " mid value:" + data[mid]);///
  57.  
  58. if(result < 0){
  59. return doSearchRecursively(low , mid - 1 , key);
  60. }else if(result > 0){
  61. return doSearchRecursively(mid + 1 , high , key);
  62. }else if(result == 0){
  63. return mid;
  64. }
  65. }
  66.  
  67. return -1;
  68. }
  69.  
  70. public int searchRecursively(T key){
  71. if(data ==null)return -1;
  72.  
  73. return doSearchRecursively(0 , data.length - 1 , key);
  74. }
  75.  
  76. public static void main(String[] args){
  77. Integer[] data = {1 ,4 ,5 ,8 ,15 ,33 ,48 ,77 ,96};
  78. BinarySearch<Integer> binSearch = new BinarySearch<Integer>(data);
  79. //System.out.println("Key index:" + binSearch.search(33) );
  80.  
  81. System.out.println("Key index:" + binSearch.searchRecursively(3) );
  82.  
  83. //String [] dataStr = {"A" ,"C" ,"F" ,"J" ,"L" ,"N" ,"T"};
  84. //BinarySearch<String> binSearch = new BinarySearch<String>(dataStr);
  85. //System.out.println("Key index:" + binSearch.search("A") );
  86. }
  87. }

【转】Java实现折半查找(二分查找)的递归和非递归算法的更多相关文章

  1. CSU OJ PID=1514: Packs 超大背包问题,折半枚举+二分查找。

    1514: Packs Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 61  Solved: 4[Submit][Status][Web Board] ...

  2. PHP实现文本快速查找 - 二分查找

    PHP实现文本快速查找 - 二分查找法 起因 先说说事情的起因,最近在分析数据时经常遇到一种场景,代码需要频繁的读某一张数据库的表,比如根据地区ID获取地区名称.根据网站分类ID获取分类名称.根据关键 ...

  3. java 13-1 数组高级二分查找

    查找: 1.基本查找:数组元素无序(从头找到尾) 2.二分查找(折半查找):数组元素有序 pS:数组的元素必须有顺序,从小到大或者从大到小.以下的分析是从小到大的数组 二分查找分析: A:先对数组进行 ...

  4. JAVA查找--[二分查找]

    package com.array; public class BinaryFind { /* * 项目名称:二分查找 ; * 项目要求:用JAVA对数组进行查找,并运用快速查找算法; * 作者:Se ...

  5. LeetCode 5198. 丑数 III(Java)容斥原理和二分查找

    题目链接:5198. 丑数 III 请你帮忙设计一个程序,用来找出第 n 个丑数. 丑数是可以被 a 或 b 或 c 整除的 正整数. 示例 1: 输入:n = 3, a = 2, b = 3, c ...

  6. poj3977(折半枚举+二分查找)

    题目链接:https://vjudge.net/problem/POJ-3977 题意:给一个大小<=35的集合,找一个非空子集合,使得子集合元素和的绝对值最小,如果有多个这样的集合,找元素个数 ...

  7. java两种实现二分查找方式

    二分查找法适用于 升序排列的数组,如果你所要操作的数组不是升序排序的,那么请用排序算法,排序一下. 说明:使用二分查找法相比顺序查找  节约了时间的开销,但是增加了空间使用.因为需要动态记录 起始索引 ...

  8. Java实现 LeetCode 704 二分查找(二分法)

    704. 二分查找 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1. 示例 1 ...

  9. 查找算法(I) 顺序查找 二分查找 索引查找

    查找 本文为查找算法的第一部分内容,包括了基本概念,顺序查找.二分查找和索引查找.关于散列表和B树查找的内容,待有空更新吧. 基本概念 查找(search)又称检索,在计算机上对数据表进行查找,就是根 ...

随机推荐

  1. SuperSocket命令加载器 (Command Loader)

    在某些情况下,你可能希望通过直接的方式来加载命令,而不是通过自动的反射. 如果是这样,你可以实现你自己的命令加载器 (Command Loader): public interface IComman ...

  2. 2014年NOIP普及组复赛题解

    题目涉及算法: 珠心算测验:枚举: 比例简化:枚举: 螺旋矩阵:模拟: 子矩阵:状态压缩/枚举/动态规划 珠心算测验 题目链接:https://www.luogu.org/problem/P2141 ...

  3. Python--day21--包

    包: 包是一种通过使用‘.模块名’来组织python模块名称空间的方式. 1. 无论是import形式还是from...import形式,凡是在导入语句中(而不是在使用时)遇到带点的,都要第一时间提高 ...

  4. Gyn 100989 "1D Cafeteria (B)"(set+lower_bound)

    传送门 •题意 某自助餐厅有 n 张桌子,桌子编号为 1~n,其中第 i 张桌子可容纳 ai 个人: 有两种操作: (1)in x : 有 x 个人来这家餐厅吃饭,需要找一个可容纳 x 人的桌子,并满 ...

  5. 浅谈集合框架五——集合框架扩展:Collections工具类的使用,自定义比较器

    最近刚学完集合框架,想把自己的一些学习笔记与想法整理一下,所以本篇博客或许会有一些内容写的不严谨或者不正确,还请大神指出.初学者对于本篇博客只建议作为参考,欢迎留言共同学习. 之前有介绍集合框架的体系 ...

  6. webpack优化 -- compression-webpack-plugin 开启gzip

    webpack优化 -- compression-webpack-plugin 开启gzip 打包的时候开启gzip可以大大减少体积,非常适合于上线部署.下面以vue-cli2.x项目为例,介绍如何在 ...

  7. web.xml和@WebServlet

    web.xml <servlet> <servlet-name>DZDYServlet</servlet-name> <servlet-class>包名 ...

  8. 【t098】符文之语

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 当小FF来到神庙时,神庙已经破败不堪了.但神庙的中央有一个光亮如新的石台.小FF走进石台, 发现石台上 ...

  9. ZR10.1青岛集训三地联考

    ZR10.1青岛集训三地联考 谢谢dijk和smy A 题目大意: 已知斐波那契数列\(f\) 设 \[ F_i = \sum_{i = 0}^nf_if_{n - i} \] 求 \[ \sum_{ ...

  10. Linux 内核热插拔事件产生

    一个热插拔事件是一个从内核到用户空间的通知, 在系统配置中有事情已经改变. 无论何 时一个 kobject 被创建或销毁就产生它们. 这样事件被产生, 例如, 当一个数字摄像头 使用一个 USB 线缆 ...