算法:二分法查找有序数组

  • 基本的二分法是通过,左右两端不断折半实现查找的算法;这里我使用一个已知在数组中的数据,去查找它在有序数组中的位置;
  • 上代码
    public static void main(String[] arg0){
        int[] array = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30};
        int start = 0;
        int middle = (array.length+1)/2;
        int end = array.length -1;

        int question = 23;
        int pos = -1;
        while (start < end){
            System.out.println("start= "+start+", end="+end);
            if (question < array[start] || question > array[end]){
                pos = -1;
                break;
            } else if (question == array[start]){
                pos = start;
                break;
            } else if (question == array[middle]){
                pos = middle;
                break;
            } else if (question == array[end]){
                pos = end;
                break;
            } else if (question > array[start] && question < array[middle]){
            	//如果数据在左半边
                start = start;
                middle = (start + middle + 1) /2;
                end = middle;
            } else if (question > array[middle] && question < array[end]){
       			//如果数据在右半边
                start = middle;
                middle = (end + middle + 1) /2;
                end = end;
            }
        }

        System.out.println("result = "+pos);
    }

上结果

start= 0, end=30
start= 16, end=30
result = 23

结论

  1. 二分法的时间复杂度为O(log2N)
  2. 关键思想是:假设该数组的长度是N,那么二分后是N/2,再二分后是N/4…直到二分到1结束(当然这是属于最坏的情况了,即每次找到的那个中点数都不是我们要找的那个数字)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值