首页 > 其他分享 >二分查找法(折半查找)

二分查找法(折半查找)

时间:2023-08-21 18:36:26浏览次数:36  
标签:折半 二分 int length 查找 数组 目标值 array

二分查找法是一种在有序数组中查找特定元素的算法。为了理解它的工作原理,我们需要知道数组是有序的,也就是说,数组中的元素按照升序或降序排列。

二分查找法的基本步骤如下:

  1. 选择数组的中间元素。

  2. 如果中间元素正好是目标值,则搜索结束。

  3. 如果目标值大于中间元素,则只需在数组的右半部分中查找。

  4. 如果目标值小于中间元素,则只需在数组的左半部分中查找。

  5. 重复以上步骤,直到找到目标值或者确定目标值不在数组中。

因为每次搜索都会将搜索范围减半,所以算法非常快速和高效。 

递归方式:

        /// <summary>
        /// 二分查找法(折半查找)
        /// </summary>
        public static void BinarySearchRecursionMain()
        {
            int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
            int length = array.Length;
            int searchVal = 15;
            int result = BinarySearchByRecursion(array, 0, length - 1, searchVal);
            if (result == -1)
                Console.WriteLine("Element not present in array");
            else
                Console.WriteLine("Element found at index " + result);
        }

        /// <summary>
        /// 二分查找法(递归实现)
        /// </summary>
        /// <param name="array">数组</param>
        /// <param name="firstIndex">查找范围的开始</param>
        /// <param name="length">查找范围的长度</param>
        /// <param name="target">查找目标</param>
        /// <returns></returns>
        public static int BinarySearchByRecursion(int[] array, int firstIndex, int length, int target)
        {
            //判断是否超过检索范围
            if (firstIndex > length)
                return -1;

            //获取中间索引
            int midIndex = firstIndex + (length - firstIndex) / 2;

            //中间索引的值
            int midVal = array[midIndex];

            if (midVal > target)        //中间索引值大于目标值则在左半边继续进行二分法查询
                return BinarySearchByRecursion(array, firstIndex, midIndex - 1, target);
            else if (midVal < target)   //目标值大于中间索引值则在右半边继续进行二分法查询
                return BinarySearchByRecursion(array, midIndex + 1, length, target);
            else                        //进行对比,值一致则返回
                return midIndex;
        }    

  

 

标签:折半,二分,int,length,查找,数组,目标值,array
From: https://www.cnblogs.com/baicai1/p/17646704.html

相关文章

  • 二分图笔记
    二分图定义二分图是一张无向图,可以分成\(2\)个集合\(A\)和\(B\)。在同一个集合中的点没有边相连。二分图判定当且仅当图中不存在奇数环时,该图为二分图。证明:反证法,构造一个奇数环。容易发现无论如何都不可能使相邻\(2\)点分到\(2\)个集合。那么很容易想到一个判定二......
  • 【算法】二分查找实现过程
    1、二分查找的基本思想是,要查找的值和整个数组序列的中间值做比较,确认该值在其中一半里,只要在数组序列一半中继续搜索。2、采用二分查找方法的前提条件是数组或线性表中元素必须按照大小有序排列。代码如下,intmain(){ intarr[]={1,2,3,4,5,6,7,8,9,10}; intk=7......
  • 用正则实现复杂的查找和替换操作
    括号在正则中的功能就是用于分组。简单来理解就是,由多个元字符组成某个部分,应该被看成一个整体的时候,可以用括号括起来表示一个整体,这是括号的一个重要功能。其实用括号括起来还有另外一个作用,那就是“复用”。那分组和编号的规则是怎样的呢?其实很简单,用一句话来说就是,第几个括号就......
  • AcWing 861. 二分图的最大匹配
    题目给定一个二分图,其中左半部包含$n_1$个点(编号$1∼n_1$),右半部包含$n_2$个点(编号$1∼n_2$),二分图共包含$m$条边。数据保证任意一条边的两个端点都不可能在同一部分中。请你求出二分图的最大匹配数。二分图的匹配:给定一个二分图$G$,在$G$的一个子图$M$中,$M$的边集......
  • 二分答案专题
    T1包裹快递题目描述一个快递公司要将\(n\)个包裹分别送到\(n\)个地方,并分配给邮递员小K一个事先设定好的路线,小K需要开车按照路线给的地点顺序相继送达,且不能遗漏一个地点。小K得到每个地方可以签收的时间段,并且也知道路线中一个地方到下一个地方的距离。若到达某一......
  • 选择冒泡插入排序 异或 二分 对数器
    算法时间复杂度O(x)空间复杂度O(x)数据状况是否影响时间复杂度表现选择排序n21否冒泡排序n21否插入排序n21是(最好情况下O(N))1.选择排序:遍历找出0~n-1最小的数放在0位置,遍历找出1~n-1最小的数放在1位置时间复杂度O(n2) 空间复杂度O(1)voidswap(vector<int>&nums,inti,intj......
  • 二分搜索法-C++
    二分法,就是对一个数组中,已经排好序的数字进行搜索。使用二分法的前提条件:1.是一个数组2.该数组中的数字已经是有序的,比如升序的数字或者降序的数字都可以。inta[]={1,2,3,4};   intb[]={4,3,2,1};3.该数组中没有出现重复的数字 二分法原理:就是对一个数组,不断的划分......
  • AcWing 860. 染色法判定二分图
    题目给定一个$n$个点$m$条边的无向图,图中可能存在重边和自环。请你判断这个图是否是二分图。输入格式第一行包含两个整数$n$和$m$。接下来$m$行,每行包含两个整数$u$和$v$,表示点$u$和点$v$之间存在一条边。输出格式如果给定图是二分图,则输出Yes,否则输出No......
  • linux 查找
    locate命令根据关键字在整个Linux系统中查找定位1.基于自己的数据库对文件进行查找;会把匹配的文件全部给出┌──(root㉿kali)-[~]└─#locate-hUsage:plocate[OPTION]...PATTERN...-b,--basenamesearchonlythefilenameportionofpat......
  • 二分图
    定义一张无向图,如果可以将节点分成两个部分,使得两个部分内部没有任何边相连,也就是每条边的端点都分属两个部分,就可以说这张图为二分图。判定当且仅当图中不存在长度为奇数的环时,这一张图为二分图。因为显然每经过一条边都会到达另一个部分,以此类推,经过奇数条边后比不可能还在......