千家信息网

如何使用java实现二分查找

发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,这篇文章将为大家详细讲解有关如何使用java实现二分查找,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、二分查找算法思想有序的序列,每次都是以序列的中间位置的数来
千家信息网最后更新 2025年01月19日如何使用java实现二分查找

这篇文章将为大家详细讲解有关如何使用java实现二分查找,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

    1、二分查找算法思想

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

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

    2、二分查找图示说明

    图片来源百度图片:

    3、二分查找优缺点

    优点:

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

    缺点:

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

    因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

    使用条件:

    查找序列是顺序结构,有序。

    3、java代码实现

    3.1 使用递归实现

    /**  * 使用递归的二分查找  *title:recursionBinarySearch  *@param arr 有序数组  *@param key 待查找关键字  *@return 找到的位置  */ public static int recursionBinarySearch(int[] arr,int key,int low,int high){    if(key < arr[low] || key > arr[high] || low > high){   return -1;      }    int middle = (low + high) / 2;   //初始中间位置  if(arr[middle] > key){   //比关键字大则关键字在左区域   return recursionBinarySearch(arr, key, low, middle - 1);  }else if(arr[middle] < key){   //比关键字小则关键字在右区域   return recursionBinarySearch(arr, key, middle + 1, high);  }else {   return middle;  }    }

    3.1 不使用递归实现(while循环)

     /**  * 不使用递归的二分查找  *title:commonBinarySearch  *@param arr  *@param key  *@return 关键字位置  */ public static int commonBinarySearch(int[] arr,int key){  int low = 0;  int high = arr.length - 1;  int middle = 0;   //定义middle    if(key < arr[low] || key > arr[high] || low > high){   return -1;      }    while(low <= high){   middle = (low + high) / 2;   if(arr[middle] > key){    //比关键字大则关键字在左区域    high = middle - 1;   }else if(arr[middle] < key){    //比关键字小则关键字在右区域    low = middle + 1;   }else{    return middle;   }  }    return -1;  //最后仍然没有找到,则返回-1 }

    3.3 测试

    测试代码:

     public static void main(String[] args) {   int[] arr = {1,3,5,7,9,11};  int key = 4;  //int position = recursionBinarySearch(arr,key,0,arr.length - 1);    int position = commonBinarySearch(arr, key);                if(position == -1){   System.out.println("查找的是"+key+",序列中没有该数!");  }else{   System.out.println("查找的是"+key+",找到位置为:"+position);  }   }

    recursionBinarySearch()的测试:key分别为0,9,10,15的查找结果

    查找的是0,序列中没有该数!

    查找的是9,找到位置为:4

    查找的是10,序列中没有该数!

    查找的是15,序列中没有该数!

    commonBinarySearch()的测试:key分别为-1,5,6,20的查找结果

    查找的是-1,序列中没有该数!

    查找的是5,找到位置为:2

    查找的是6,序列中没有该数!

    查找的是20,序列中没有该数!

    4、时间复杂度

    采用的是分治策略

    最坏的情况下两种方式时间复杂度一样:O(log2 N)

    最好情况下为O(1)

    5、空间复杂度

    算法的空间复杂度并不是计算实际占用的空间,而是计算整个算法的辅助空间单元的个数

    非递归方式:
    由于辅助空间是常数级别的所以:空间复杂度是O(1);

    递归方式:递归的次数和深度都是log2 N,每次所需要的辅助空间都是常数级别的:

    空间复杂度:O(log2N )

    关于"如何使用java实现二分查找"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

    关键 关键字 位置 序列 空间 递归 复杂 复杂度 有序 成功 区域 测试 方式 算法 篇文章 辅助 代码 图片 常数 情况 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 虹口区网络技术开发供应商 网络安全小公民教学设计 数据库原理与应用中关键字的含义 javaweb文件上传至数据库 构建网络安全工作组织构架 广工计算机网络技术实验 私域服务器 mac软件开发swift 上海质量网络技术转让价目表 什么叫网络安全工程 imc数据库怎么改 云上番茄网络技术服务部 数据库中的记录是由什么组成的 数据库中单元格中如何换行 自考 软件开发工具试题 三级网络技术考试 网络安全法修订后的主要内容 网络安全周电信日是几号 北京交警内部服务器异常 三调用的什么数据库 服务器sdk接口说明书 赞皇应用软件开发服务诚信推荐 数据库技术在企业中的应用 数据库用户怎么导出来 大天使之剑新开服务器 共建分布式网络安全大脑周鸿祎 php数据库使用教程视频教程 软件开发部门kpi指标 fifa4韩服数据库中文 服务器被攻击造成的损失
    0