二分查找实现

看了“只有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;
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值