【转】Java实现折半查找(二分查找)的递归和非递归算法
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://wintys.blog.51cto.com/425414/94051 |
- /**
- *名称:BinarySearch
- *功能:实现了折半查找(二分查找)的递归和非递归算法.
- *说明:
- * 1、要求所查找的数组已有序,并且其中元素已实现Comparable<T>接口,如Integer、String等.
- * 2、非递归查找使用search();,递归查找使用searchRecursively();
- *
- *本程序仅供编程学习参考
- *
- *@author: Winty
- *@date: 2008-8-11
- *@email: wintys@gmail.com
- */
- class BinarySearch<T extends Comparable<T>> {
- private T[] data;//要排序的数据
- public BinarySearch(T[] data){
- this.data = data;
- }
- public int search(T key){
- int low;
- int high;
- int mid;
- if(data == null)
- return -1;
- low = 0;
- high = data.length - 1;
- while(low <= high){
- mid = (low + high) / 2;
- System.out.println("mid " + mid + " mid value:" + data[mid]);///
- if(key.compareTo(data[mid]) < 0){
- high = mid - 1;
- }else if(key.compareTo(data[mid]) > 0){
- low = mid + 1;
- }else if(key.compareTo(data[mid]) == 0){
- return mid;
- }
- }
- return -1;
- }
- private int doSearchRecursively(int low , int high , T key){
- int mid;
- int result;
- if(low <= high){
- mid = (low + high) / 2;
- result = key.compareTo(data[mid]);
- System.out.println("mid " + mid + " mid value:" + data[mid]);///
- if(result < 0){
- return doSearchRecursively(low , mid - 1 , key);
- }else if(result > 0){
- return doSearchRecursively(mid + 1 , high , key);
- }else if(result == 0){
- return mid;
- }
- }
- return -1;
- }
- public int searchRecursively(T key){
- if(data ==null)return -1;
- return doSearchRecursively(0 , data.length - 1 , key);
- }
- public static void main(String[] args){
- Integer[] data = {1 ,4 ,5 ,8 ,15 ,33 ,48 ,77 ,96};
- BinarySearch<Integer> binSearch = new BinarySearch<Integer>(data);
- //System.out.println("Key index:" + binSearch.search(33) );
- System.out.println("Key index:" + binSearch.searchRecursively(3) );
- //String [] dataStr = {"A" ,"C" ,"F" ,"J" ,"L" ,"N" ,"T"};
- //BinarySearch<String> binSearch = new BinarySearch<String>(dataStr);
- //System.out.println("Key index:" + binSearch.search("A") );
- }
- }
【转】Java实现折半查找(二分查找)的递归和非递归算法的更多相关文章
- CSU OJ PID=1514: Packs 超大背包问题,折半枚举+二分查找。
1514: Packs Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 61 Solved: 4[Submit][Status][Web Board] ...
- PHP实现文本快速查找 - 二分查找
PHP实现文本快速查找 - 二分查找法 起因 先说说事情的起因,最近在分析数据时经常遇到一种场景,代码需要频繁的读某一张数据库的表,比如根据地区ID获取地区名称.根据网站分类ID获取分类名称.根据关键 ...
- java 13-1 数组高级二分查找
查找: 1.基本查找:数组元素无序(从头找到尾) 2.二分查找(折半查找):数组元素有序 pS:数组的元素必须有顺序,从小到大或者从大到小.以下的分析是从小到大的数组 二分查找分析: A:先对数组进行 ...
- JAVA查找--[二分查找]
package com.array; public class BinaryFind { /* * 项目名称:二分查找 ; * 项目要求:用JAVA对数组进行查找,并运用快速查找算法; * 作者:Se ...
- LeetCode 5198. 丑数 III(Java)容斥原理和二分查找
题目链接:5198. 丑数 III 请你帮忙设计一个程序,用来找出第 n 个丑数. 丑数是可以被 a 或 b 或 c 整除的 正整数. 示例 1: 输入:n = 3, a = 2, b = 3, c ...
- poj3977(折半枚举+二分查找)
题目链接:https://vjudge.net/problem/POJ-3977 题意:给一个大小<=35的集合,找一个非空子集合,使得子集合元素和的绝对值最小,如果有多个这样的集合,找元素个数 ...
- java两种实现二分查找方式
二分查找法适用于 升序排列的数组,如果你所要操作的数组不是升序排序的,那么请用排序算法,排序一下. 说明:使用二分查找法相比顺序查找 节约了时间的开销,但是增加了空间使用.因为需要动态记录 起始索引 ...
- Java实现 LeetCode 704 二分查找(二分法)
704. 二分查找 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1. 示例 1 ...
- 查找算法(I) 顺序查找 二分查找 索引查找
查找 本文为查找算法的第一部分内容,包括了基本概念,顺序查找.二分查找和索引查找.关于散列表和B树查找的内容,待有空更新吧. 基本概念 查找(search)又称检索,在计算机上对数据表进行查找,就是根 ...
随机推荐
- SuperSocket命令加载器 (Command Loader)
在某些情况下,你可能希望通过直接的方式来加载命令,而不是通过自动的反射. 如果是这样,你可以实现你自己的命令加载器 (Command Loader): public interface IComman ...
- 2014年NOIP普及组复赛题解
题目涉及算法: 珠心算测验:枚举: 比例简化:枚举: 螺旋矩阵:模拟: 子矩阵:状态压缩/枚举/动态规划 珠心算测验 题目链接:https://www.luogu.org/problem/P2141 ...
- Python--day21--包
包: 包是一种通过使用‘.模块名’来组织python模块名称空间的方式. 1. 无论是import形式还是from...import形式,凡是在导入语句中(而不是在使用时)遇到带点的,都要第一时间提高 ...
- Gyn 100989 "1D Cafeteria (B)"(set+lower_bound)
传送门 •题意 某自助餐厅有 n 张桌子,桌子编号为 1~n,其中第 i 张桌子可容纳 ai 个人: 有两种操作: (1)in x : 有 x 个人来这家餐厅吃饭,需要找一个可容纳 x 人的桌子,并满 ...
- 浅谈集合框架五——集合框架扩展:Collections工具类的使用,自定义比较器
最近刚学完集合框架,想把自己的一些学习笔记与想法整理一下,所以本篇博客或许会有一些内容写的不严谨或者不正确,还请大神指出.初学者对于本篇博客只建议作为参考,欢迎留言共同学习. 之前有介绍集合框架的体系 ...
- webpack优化 -- compression-webpack-plugin 开启gzip
webpack优化 -- compression-webpack-plugin 开启gzip 打包的时候开启gzip可以大大减少体积,非常适合于上线部署.下面以vue-cli2.x项目为例,介绍如何在 ...
- web.xml和@WebServlet
web.xml <servlet> <servlet-name>DZDYServlet</servlet-name> <servlet-class>包名 ...
- 【t098】符文之语
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 当小FF来到神庙时,神庙已经破败不堪了.但神庙的中央有一个光亮如新的石台.小FF走进石台, 发现石台上 ...
- ZR10.1青岛集训三地联考
ZR10.1青岛集训三地联考 谢谢dijk和smy A 题目大意: 已知斐波那契数列\(f\) 设 \[ F_i = \sum_{i = 0}^nf_if_{n - i} \] 求 \[ \sum_{ ...
- Linux 内核热插拔事件产生
一个热插拔事件是一个从内核到用户空间的通知, 在系统配置中有事情已经改变. 无论何 时一个 kobject 被创建或销毁就产生它们. 这样事件被产生, 例如, 当一个数字摄像头 使用一个 USB 线缆 ...