算法之二分法查找
2015-06-17 09:04
295 查看
二分法检索(binary search)又称折半检索,二分法检索的基本思想是设字典中的元素从小到大有序地存放在数组(array)中,
首先将给定值key与字典中间位置上元素的关键码(key)比较,如果相等,则检索成功;
否则,若key小,则在字典前半部分中继续进行二分法检索;
若key大,则在字典后半部分中继续进行二分法检索。
这样,经过一次比较就缩小一半的检索区间,如此进行下去,直到检索成功或检索失败。
偶数个取中间2个其中任何一个作为中间元素
二分法检索是一种效率较高的检索方法,要求字典在顺序表中按关键码排序。
java 代码
成功返回所在位置,失败返回负数
首先将给定值key与字典中间位置上元素的关键码(key)比较,如果相等,则检索成功;
否则,若key小,则在字典前半部分中继续进行二分法检索;
若key大,则在字典后半部分中继续进行二分法检索。
这样,经过一次比较就缩小一半的检索区间,如此进行下去,直到检索成功或检索失败。
偶数个取中间2个其中任何一个作为中间元素
二分法检索是一种效率较高的检索方法,要求字典在顺序表中按关键码排序。
java 代码
成功返回所在位置,失败返回负数
package ForTest; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Arithmetic{ public static<T extends Comparable<? super T> > int BinarySearch(List<T> array, int start, int end, T key) { int low; int high; int guess; if(array == null || start>end || start > array.size()-1 || end < 0) { return -1; } start = start < 0 ? 0 : start; low = start-1; end = end > array.size()-1 ? array.size()-1 : end; high = end+1; while (high - low > 1) { guess = ((high - low)>>1) + low; if (array.get(guess).compareTo(key) < 0) low = guess; else high = guess; } if (high == end +1 ) { return ~(end +1 ); } else if (array.get(high).compareTo(key) == 0) { return high; } else { return ~high; } } public static<T extends Comparable<? super T> > int BinarySearch(T[] array, int start, int end, T key) { List<T> stooges = Arrays.asList(array); return Arithmetic.BinarySearch(stooges, start, end, key); } public static void main(String[] args) { // TODO Auto-generated method stub ArrayList<Integer> a = new ArrayList<Integer>(); Float[] b = new Float[100]; for(int i=0; i<100; i++) { a.add(i); b[i] = (float) i; } System.out.println(""+Arithmetic.BinarySearch(a,0,1000,200)); System.out.println(""+Arithmetic.BinarySearch(b,0,100,2.f)); } }
相关文章推荐
- 算法-插入排序
- 每天一个linux命令(23):Linux 目录结构
- 我——成为一个人,不再迷茫
- 九歌·湘夫人
- delete table 和 truncate table
- iOS 9 新增 UIStackView 官方文档翻译
- 源码推荐(6.17):keyboard细节处理 流畅 简洁 复用性高,用tableview解决长文字 过多项的Actio
- 10步成为专业iOS开发者——从零起步
- 第15周 程序阅读-二进制文件及文件的读取4
- HDU 5039 Hilarity(dfs序+线段树)
- Android 屏幕实现水龙头事件
- 2015 Objective-C 三大新特性
- 第十五周程序阅读三
- 欢迎使用CSDN-markdown编辑器
- 用二进制文件处理学生信息
- 6.17 阅读程序 理解seekg() tellg()的用法
- hbase shell 常用命令
- 图片或文件上传阿里云服务
- 移动端rem案例
- DL、 DT、 DD使用