原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。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. 用于数组的delete p324

    delete 对象地址; delete 首先调用待清除对象的析构函数,然后释放内存 如果delete一个void指针,唯一发生的事情就是释放了内存.因为通过void指针,无法知道对象的类型,就无法调用 ...

  2. JPA进行insert操作时会首先select吗

    在某个项目中,使用JPA的saveAll方法去批量写入数据时,通过打印sql,发现每次insert前都会先select一次,极大的浪费了写入性能. 分析一下代码,saveAll() @Transact ...

  3. C# 16 进制字符串转 int

    最近在写硬件,发现有一些测试是做 16 进制的字符串,需要把他转换为整形才可以处理. 本文告诉大家如何从 16 进制转整形 如果输入的是 0xaa 这时转换 int 不能使用 Parse 不然会出现异 ...

  4. html(四)数据库curd操作与分页查询

    数据库操作curd : 1.首先要建立项目处理好自己逻辑包: 其中util工具包中建立两个工具类 jdbc连接和page分页 DBUtil.java: db工具类就是用于连接数据库的jdbc架包,里面 ...

  5. angular 全局常用指令

    1.全局支持 enter快捷键触发事件 // 全局指令 app.directive('ngEnter', ['$window',"$timeout", ($window,$time ...

  6. WPF 使用 SharpDx 异步渲染

    本文告诉大家如何通过 SharpDx 进行异步渲染,但是因为在 WPF 是需要使用 D3DImage 画出来,所以渲染只是画出图片,最后的显示还是需要 WPF 在他自己的主线程渲染 本文是一个系列,希 ...

  7. win10 uwp 解决 SerialDevice.FromIdAsync 返回空

    调用 SerialDevice.FromIdAsync 可能返回空,因为没有设置 package.appmanifest 可以使用端口 打开 package.appmanifest 文件添加下面代码 ...

  8. linux 基于 jiffy 的超时

    到目前为止所展示的次优化的延时循环通过查看 jiffy 计数器而不告诉任何人来工作. 但是最好的实现一个延时的方法, 如你可能猜想的, 常常是请求内核为你做. 有 2 种方 法来建立一个基于 jiff ...

  9. string的常见操作

    访问 遍历 不需修改:for(auto c : s)   需要修改:for(auto &c : s)​ for(decltype(s.size()) i = 0; i < s.size( ...

  10. c3p0连接池封装

    在处理数据库事物时需要同一个Connection  但是dbcp无法获得  单独工具也显得繁琐,改进成c3p0工具类: package utils; import java.sql.Connectio ...