• 二分查找binary search


    1. 解决实际问题

    在这里插入图片描述

    这就是一个查找问题,这个时候就可以使用二分查找算法

    2. 实现原理

    二分查找是一种算法,其是对一个有序的元素列表进行查找(查找对象必须有序)。

    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述

    3. 代码实现步骤

    1. 首先要确定该数组的中间下标(左右下标是动态变化的)
      mid=(left+right)/2
    2. 然后让需要查找的数findVal和arr[mid]比较
      a) findVal>arr[mid] ,说明要查找的数在mid的右边,需要递归向右查找
      b) findVal c) findVal=arr[mid]说明找到,就返回相应的数组下标
    3. 什么时候递归结束(出口)
      a) 找到结果就递归结束
      b) 递归完整个数组,任然没有找到findVal,也需要结束递归,当left>right的时候就说明检索完数组都没找到。

    4. java代码实现

    public class BinarySearch {
        public static void main(String[] args) {
            //注意使用二分查找的前提是,该数组是有序的
            int arr[]={1,8,10,89,1000,1234};
            int resIndex=binarySearch(arr,0,arr.length-1,89);
            System.out.println("resIndex:"+resIndex);
        }
        //二分查找
    
        /**
         *
         *
         * @param arr  需要进行查找的数组
         * @param left  查找范围的最左边索引值,动态变化,初始值是0
         * @param right 查找范围的最后边索引值,动态变化,初始值是数组的最大索引值
         * @param findVal   需要查找的值
         * @return
         */
        public static int binarySearch(int[] arr,int left,int right,int findVal){
            //当left>right的时候,说明递归结束,但是没有找到
            if(left>right){
                return -1;
            }
            int mid=(left+right)/2;
            int midVal=arr[mid];
            if (findVal>midVal){
                return binarySearch(arr,mid+1,right,findVal);
            }else if(findVal<midVal){
                return binarySearch(arr,left,mid-1,findVal);
            }else{
                return mid;
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    5. C++代码实现

    
    #include 
    
    
    
    int binarySearch(int arr[],int left,int right,int findVal) {
    	//出口
    	//当left
    	if(left>right)
    	{
    		return -1;
    	}
    	//int mid = (left + right) / 2;
    	int mid = left + (right - left) / 2;//防止数据过大,越界
    	int midVal = arr[mid];
    	//当需要查找值大于中值时候,需要向右递归
    	if (findVal>midVal) {
    		return binarySearch(arr, mid + 1, right,findVal);
    	}else if(findVal<midVal)
    	{
    		//当需要查找值小于中指的时候,须有向左递归
    		return binarySearch(arr, left, mid - 1, findVal);
    	}else 
    	{
    		return mid;
    	}
    }
    int main()
    {
    	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
    	//查找范围的最左边索引和最右边索引是动态变化的
    	int left = 0;
    	int right = sizeof(arr) / sizeof(arr[0]) - 1;
    
    	std::cout << binarySearch(arr,left,right,0) << std::endl;
    }
    
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    6. 刷题

  • 相关阅读:
    如何通过puppetter实现PDF聚合阅读器初始模型以及产品思维构想
    基于JAVA+SpringMVC+MYSQL的网上人才招聘系统
    四、通信和网络安全—网络通信基础与网络基础设施(CISSP)
    2022国赛正式题iscis服务
    聊聊单点登录(SSO)中的CAS认证
    捉虫日记 | MySQL 8.0从库某些情况下记录重放的CREATE TABLE、DROP TABLE语句到慢日志(slow log)
    Python酷库之旅-比翼双飞情侣库(17)
    微信小程序显示流格式照片
    CAN协议解析
    Linux-Ubuntu lxml库导入失败 解决方法
  • 原文地址:https://blog.csdn.net/weixin_45856470/article/details/126911606