您的位置:首页 > 其它

二分查找实现

2012-07-30 11:19 218 查看
看了“只有10%程序员能正确实现二分查找算法“这篇文章,闲着无聊,就实现一下他所说的正确的二分算法;

其实说穿了为什么只有10%的程序员会写错,只是因为没有考虑一些意外情况罢了;

思想:

二分查找能解决问题:预排序数组的查找

1.使用泛型将二分查找的对象泛化.

2.考虑以下几种意外情况:

如果数组为null,则抛异常;

如果没有找到,则返回-1;

其实我也不清楚有没有bug...如果有人发现了,就指出吧。

package com.xiazdong.binarysearch.util;

public class BinarySearchUtil<T> {
/**
* 使用实例
* BinarySearchUtil<Integer> bs = new BinarySearchUtil<Integer>();
* int position = bs.binarySearch(new Integer[]{1,2,3,4,5},2);
*
* 注:
* class A implements Comparable{
* 		public int compareTo(A a){
* 			this 与 a比较
* 			如果this<a , 则返回-1
* 			如果this==a,则返回  0
* 			如果this>a ,则返回  1
* 		}
* }
* @param <T>  任何实现了Comparable<T>的类型
* @param arr  数组
* @param key  查找的值
* @return  如果找到了,返回响应位置,如果没有找到,则返回-1
*/
public static <T extends Comparable<T>> int binarySearch(T [] arr, T key) {
if(arr==null){		//数组不能为空
throw new NullPointerException("数组不能为空");
}
int begin = 0;
int end = arr.length - 1;
int midden = (begin+end)/2;
while(begin<=end){

if(arr[midden].compareTo(key)==0){
return midden;
}
else if(arr[midden].compareTo(key)<0){
begin = midden+1;
}
else if(arr[midden].compareTo(key)>0){
end = midden-1;
}
midden = (begin+end)/2;
}
return -1;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: