二分搜索算法

来源:互联网 发布:刷svip永久软件 编辑:程序博客网 时间:2024/04/30 07:00
/**
*今天我勉强搞懂了二分查找算法,我觉得很有收获,这是个不错的算法,希望还不知道、不懂二分算法的朋友能看看!!!
*二分查找
*二分查找的前提是数组一定是有序的
*传入一个数组 T []
* 传入一个查找元素 T key
*返回查找结果
*/
class MyUtil
{
    //在有序数组中查找特定元素的搜索算法 , 这种搜索算法每一次比较都使搜索范围缩小一半。
    public static <T extends Comparable<T>> int binarySerch(T [] x , T key){
        int low = 0; //低位变量,初始为 0
        int high = x.length - 1; // 高位变量,初始为传入数组的长度 - 1
        while(low <= high){
            //mid 是中间位,这里的中间位不能直接用(high+ low) / 2的方式,会造成 整数 越界。
            int mid = low + ((high -low) >> 1); //这里的异或运算的优先等级低于加减运算,所以要扩起来,不然会是死循环。
            if(key.compareTo(x[mid]) < 0){ // 当查找元素小于中间元素时
                high = mid -1;             //最高位就折半到了mid之前的位置
            }
            else if(key.compareTo(x[mid]) > 0){ //档查找元素大于中间元素时
                low = mid +1;                   //最高位就这般到了mid之后的位置
            }
            else{ //当查找元素等于中间位置的元素时
                return mid; // 返回找到的元素位置
            }
        }
        return -1; // 没找到就返回 -1
    }


    public static void main(String[] args)
    {

        Integer [] x = {1,2,3,4,5,6,7,8,9}; //有序的Integer数组
        int key = 3; //查找元素

        //String [] x = {"a","b","c","d","e","f","g","h","i","j"};//有序的String数组
        //String key = "f";//查找元素

        int num = binarySerch(x , key); //调用并得到返回的元素位置
        System.out.println(num);
}
}


0 0