数据结构与算法——java二分查找算法(递归+非递归实现)

二分查找算法

1、思想

有序的序列,每次都是以序列的中间位置的数来与待查找的关键字进行比较,每次缩小一半的查找范围,直到匹配成功。

实现思路:

(1)将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;
(2)否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。
(3)重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

2、二分查找法的优缺点

优点:
比较次数少,查找速度快,平均性能好;

缺点:
要求待查表为有序表,且插入删除困难。

使用条件:
查找序列是顺序结构,有序。

3、java的递归和非递归实现

public class test01 {

    public static void main(String args[]) {
        int [] array={24,56,68,77,79,93,97};
        select1(array,93,0,array.length-1);
        select2(array,93);
    }

    /**
     * 二分查找方法一:递归实现
     * @param array
     */
    private static int select1(int[] array,int target,int low,int high) {
        if(low<0||high>array.length-1||low>high){
           System.out.println("有错误!!!");
           return -1;
        }
        int middle=(low+high)/2;
        if(array[middle]>target){
            return select1(array,target,low,middle-1);
        }else if(array[middle]<target){
            return select1(array,target,middle+1,high);
        }else{
            System.out.println("递归法实现二分查找:  "+array[middle]+"的index是:"+middle);
            return middle;
        }
    }
    /**
     * 二分查找方法二:非递归实现
     * @param array
     */
    private static int select2(int[] array,int target) {
        int left=0;//左
        int right=array.length-1;//右
        int middle=0;
        while(left>=0&&right<array.length&&left<right){
            middle=(left+right)/2;
            if(array[middle]>target){
                right=middle-1;
            }else if(array[middle]<target){
                left=middle+1;
            }else{
                System.out.println("非递归法实现二分查找:  "+array[middle]+"的index是:"+middle);
                return middle;
            }
        }
        return -1;
    }
}

4、二分查找的时间复杂度分析

分析二分查找法的执行过程。
在这里插入图片描述
从上表可以看出N/(2^K)
肯定是大于等于1,也就是N/(2^K)>=1,

我们计算时间复杂度是按照最坏的情况进行计算,也就是是查到剩余最后一个数才查到我们想要的数据,也就是
N/(2^K)=1
=>N=2^K
=>K=log2N
所以二分查找的时间复杂度为O(log2N)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值