• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
百事可爱
一起努力鸭~~~
博客园    首页    新随笔    联系   管理    订阅  订阅
二分查找

二分查找(又称折半查找)

1. 适用场景:顺序存储结构且按有序排列
2. 查找过程:
首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
3. 算法复杂度
二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x<a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则只要在数组a的右半部搜索x.
时间复杂度即是while循环的次数。
总共有n个元素,
渐渐跟下去就是n,n/2,n/4,....n/2^k(接下来操作元素的剩余个数),其中k就是循环的次数
由于你n/2^k取整后>=1
即令n/2^k=1
可得k=log2n,(是以2为底,n的对数)
时间复杂度可以表示O(h)=O(log2n)

package 二分查找;

public class BinarySearch {

	public static void main(String[] args) {
		 int[] array = {1,3,8,10,11,22,100};
		 //要查找的数值是10
		 int index1 = binSearch_1(10, array);
		 System.out.println("index1="+index1);
		 
		 int index2 = binSearch_2(10, array, 0,  array.length-1);
		 System.out.println("index2="+index2);

	}
	
	 
	/*
     *1.循环实现二分算法
     */
    /**
     * @param key  要查找的数值
     * @param array  待查找的数组  默认array数组有序且是升序的
     * @return   返回对应的下标,-1代表没有找到
     */
    public static int binSearch_1(int key, int[] array) { 
        int low = 0; //第一个下标
        int high = array.length - 1;//最后一个下标
        int middle = 0;
        //防越界
        if (key < array[low] || key > array[high] || low > high) {
            return -1;
        }
        while (low <= high) {
            middle = (low + high) / 2;
            if (array[middle] == key) {
                return  middle ;
            } else if (array[middle] < key) {
                low = middle + 1;//需要去右边找
            } else {
                high = middle - 1;//需要去左边找
            }
        }
        return -1;
    }

    /*
     *2. 递归实现二分算法
     */
    /**
     * @param key  要查找的数值
     * @param array  待查找的数组  默认array数组有序且是升序的
     * @param low  数组起始下标
     * @param high 数组末尾下标
     * @return    返回对应的下标,-1代表没有找到
     */
    public static int binSearch_2(int key,int[] array,int low,int high){
        //防越界
        if (key < array[low] || key > array[high] || low > high) {
            return -1;
        }
        int middle = (low+high)/2;
        if(array[middle]>key){
            //大于关键字
            return  binSearch_2(key,array,low,middle-1);
        }else if(array[middle]<key){
            //小于关键字
            return binSearch_2(key,array,middle+1,high);
        }else{
            return  middle ;
        }
    }
}

posted on 2022-03-17 10:01  精致猪猪侠  阅读(79)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3