【转】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)又称检索,在计算机上对数据表进行查找,就是根 ...
随机推荐
- 用于数组的delete p324
delete 对象地址; delete 首先调用待清除对象的析构函数,然后释放内存 如果delete一个void指针,唯一发生的事情就是释放了内存.因为通过void指针,无法知道对象的类型,就无法调用 ...
- JPA进行insert操作时会首先select吗
在某个项目中,使用JPA的saveAll方法去批量写入数据时,通过打印sql,发现每次insert前都会先select一次,极大的浪费了写入性能. 分析一下代码,saveAll() @Transact ...
- C# 16 进制字符串转 int
最近在写硬件,发现有一些测试是做 16 进制的字符串,需要把他转换为整形才可以处理. 本文告诉大家如何从 16 进制转整形 如果输入的是 0xaa 这时转换 int 不能使用 Parse 不然会出现异 ...
- html(四)数据库curd操作与分页查询
数据库操作curd : 1.首先要建立项目处理好自己逻辑包: 其中util工具包中建立两个工具类 jdbc连接和page分页 DBUtil.java: db工具类就是用于连接数据库的jdbc架包,里面 ...
- angular 全局常用指令
1.全局支持 enter快捷键触发事件 // 全局指令 app.directive('ngEnter', ['$window',"$timeout", ($window,$time ...
- WPF 使用 SharpDx 异步渲染
本文告诉大家如何通过 SharpDx 进行异步渲染,但是因为在 WPF 是需要使用 D3DImage 画出来,所以渲染只是画出图片,最后的显示还是需要 WPF 在他自己的主线程渲染 本文是一个系列,希 ...
- win10 uwp 解决 SerialDevice.FromIdAsync 返回空
调用 SerialDevice.FromIdAsync 可能返回空,因为没有设置 package.appmanifest 可以使用端口 打开 package.appmanifest 文件添加下面代码 ...
- linux 基于 jiffy 的超时
到目前为止所展示的次优化的延时循环通过查看 jiffy 计数器而不告诉任何人来工作. 但是最好的实现一个延时的方法, 如你可能猜想的, 常常是请求内核为你做. 有 2 种方 法来建立一个基于 jiff ...
- string的常见操作
访问 遍历 不需修改:for(auto c : s) 需要修改:for(auto &c : s) for(decltype(s.size()) i = 0; i < s.size( ...
- c3p0连接池封装
在处理数据库事物时需要同一个Connection 但是dbcp无法获得 单独工具也显得繁琐,改进成c3p0工具类: package utils; import java.sql.Connectio ...