二分查找-针对已排序数组

二分查找

如有重复返回第一个出现位置的数组坐标
二分查找的时间复杂度为log2n(其查找前提是已排序啦,顺序查找当然是n)


public class BinarySearch {
    public static void main(String[] args) {
        int [] A = {1,3,3,3,3,4,4,4,5,5,5,5};
        System.out.print("二分查找的结果(显示第一个出现的位置):"+getPos(A,A.length,4));
    }

    public static int getPos(int[] A, int n, int val) {
        // write code here
        int l=0,r=n-1;
        while(l<=r){ //<=的时候
            int pos = (l+r)/2; //(l+r+1)/2也行啊,但是不能+2(l=r)
            int vs = ((Integer)A[pos]).compareTo(val);
            if(vs==0){
                //中间值相等,需要使用for循环返回第一个!
                for (int i = pos-1; i >= l ; i--) {
                    if(((Integer)A[i]).compareTo((Integer)A[pos])==0){
                        pos--;
                    }else {
                        break;
                    }
                }

                return pos;
            }else if (vs==1){
                r=pos-1;
            }else{
                l=pos+1;
            }
        }

        return -1;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值