• 经典算法之折半查找法


    活动地址:21天学习挑战赛

    目录

    一、 算法

    概述

    算法过程

    二、代码实践

    三、复杂度分析

    时间复杂度

    空间复杂度

    四、优缺点分析

    优点

    缺点


    一、 算法

    概述

            折半查找( Binary Search )也称二分查找,它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列

    算法过程

    • 从表的中间记录开始,如果给定值和中间记录的关键字相等,则查找成功
    • 如果给定值大于中间记录的关键字,则继续在右半区间进行查找
    • 如果给定值小于中间记录的关键字,则继续在左半区间进行查找
    • 重复操作,直到查找成功,或者在某一步中查找区间为空,即左右区间交错,则查找失败

     


     
     

    二、代码实践

    1. package TwentyOne_Challenge;
    2. public class DayFive {
    3. public static void main(String[] args) {
    4. int []a={3,38,5,44,15,36,26,27,2,47,46,4,19,50,48};
    5. sort(a);
    6. System.out.print("递增序列如下:");
    7. for (int i = 0; i
    8. System.out.print(a[i]+" ");
    9. }
    10. System.out.println();
    11. int result1=Search(a,15);
    12. int result2=Search(a,666);
    13. System.out.println("查找15的结果为:"+result1);
    14. System.out.println("查找666的结果为:"+result2);
    15. }
    16. //折半查找法,找到返回其下标,找不到返回失败标志:-1
    17. private static int Search(int a[],int key){
    18. //left,right表示左右区间的下标
    19. int left=0,right=a.length-1;
    20. //循环终止条件为左右区间发生交错
    21. while(left<=right){
    22. //取出中间元素的下标,下面的下法是为了防止数据量较大时发生溢出
    23. int mid=(right-left)/2+left;
    24. if(a[mid]==key){
    25. return mid;
    26. }else if(a[mid]
    27. //继续在右半区间找
    28. left=mid+1;
    29. }else {
    30. //继续在左半区间找
    31. right=mid-1;
    32. }
    33. }
    34. //如果循环结束还未触发return语句说明查找失败
    35. return -1;
    36. }
    37. //使用选择排序法先将数组变成递增有序的序列
    38. private static void sort(int a[]){
    39. for(int i=0;i1;i++){
    40. int min=i;
    41. for(int j=i+1;j
    42. if(a[j]
    43. min=j;
    44. }
    45. }
    46. if(min!=i){
    47. int temp=a[min];
    48. a[min]=a[i];
    49. a[i]=temp;
    50. }
    51. }
    52. }
    53. }

     


     

     

    三、复杂度分析

    时间复杂度

    • 最好的情况

    最好的情况当然是一发入魂啦,第一次就找到了目标值,所以其时间复杂度为常数级别O(1)

    • 最坏的情况

    最坏的情况是最后一次折半才找到目标值或者说最后没有找到即查找失败,但是元素个数是固定死的就是n,就像一根长度为n的竹子,每天折一半,最多能折的次数其实就是以2为底n的对数

    综合以上两种情况,折半查找法的时间复杂度为:

     

    空间复杂度

    由于算法不会改变原有的集合,只是需要三个额外的辅助变量,所以空间复杂度为常数级O(1)

     


     

    四、优缺点分析

    优点

    • 比较次数少,查询效率较高

    缺点

    • 对表结构的要求较高,只能用于顺序存储的有序表
    • 查找前需要先排序,这本身也是一种费时的运算

     

  • 相关阅读:
    Ubuntu18.04LTS环境下创建OpenCV4.x-Android库
    BGP联邦实验详解 超级超级超级超级超级详细!附有源码自取~
    推荐系统-协同过滤在Spark中的实现
    Navicat连接postgresql时出现‘datlastsysoid does not exist‘报错的问题
    技术分享 | 多测试环境的动态伸缩实践
    pytorch tensor的广播机制
    大数据开发写sql写烦了,要不要转?
    Python异步编程原理篇之IO多路复用模块selector
    NewStarCTF 2023 week5--web
    Ubuntu20.04出现只显示本地环回,无法打开网卡解决方法
  • 原文地址:https://blog.csdn.net/qq_52487066/article/details/126321211