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

折半查找(二分)

时间:2023-05-10 11:47:07浏览次数:37  
标签:折半 二分 int mid 问题 查找

一、问题描述

  N个有序整数数列已放在一维数组中, 利用二分查找法查找整数m在数组中的位置。若找到,则输出其下标值:反之,则输出“Not be found!"。

二、问题分析

  二分查找法(也叫折半查找)其本质是分治算法的一种。所谓分治算法是指的分而治之,即将较大规模的问题分解成几个较小规模的问题,这些子问题互相独立且与原问题相同,通过对较小规模问题的求解达到对整个问题的求解。我们把将问题分解成两个较小问题求解的分治方法称为二分法。需要注意的是,二分查找法只适用于有序序列。
  二分查找的基本思想是:每次查找前先确定数组中待查的范围,假设指针low和high(low<high)分 别指示待查范围的下界和上界,指针mid指示区间的中间位置,即mid=(low+high) /2,把m与中间位置(mid)中元素的值进行比较。如果m的值大于中间位置元素中的值,则下-次的查找范围放在中间位置之后的元素中:反之,下一次的查找范围放在中间位置之前的元素中享到orwtigh, 查找结束。

三、二分算法的适用范围

  二分算法可以快速的寻找一个序列种的边界值,那何为边界值呢。

对于一个有序的序列来说,我们可以将这个数列以一个数n为边界,这个数的左边所有数满足一个性质(比如说小于n),这个数的右边所有数则满足另外一个性子(比如说大于等于n),此时我们则可以用二分对这个n进行快速查找。

注意:二分一定是有解的,但是对于一个题目来说,题目可能无解(即二分出来的结果并不是你想要找的那个数)。

四、代码实现:

#include<iostream>
using namespace std;
int main()
{
    int a[10] = { -3,4,7,9,13,45,67,89,100,180 };
    int l = 0, r = 9, m;
    cin >> m;
    while (l < r)
    {
        int mid = l + r >> 1;
        if (a[mid] >= m) r = mid;
        else l = mid + 1;
    }
    if (a[l] == m) cout << l << endl;
    else cout << "Not be found!" << endl;
    return 0;
}
View Code

 

 

 

标签:折半,二分,int,mid,问题,查找
From: https://www.cnblogs.com/zk126/p/17387490.html

相关文章

  • 二分
    寻找重复数寻找重复数classSolution{publicintfindDuplicate(int[]nums){intlen=nums.length;intl=1,r=len-1;while(l<r){intmid=(l+r)/2;intcount=0;for(intnum:......
  • 归档 230502 // 二分图
    Sowhynot二分图?二分图二分图总体概念不难。主要是其应用广泛,需要注意什么样的题目可以联系到二分图上来。概念若图\(G\)可将点集\(V\)分成两个互不相交的子集\(X\)和\(Y\),且每条边连接的两个点都满足一个在\(X\)中,一个在\(Y\)中,则称\(G\)为二分图。也就是说,......
  • 「TJOI2018」智力竞赛(二分+DAG最小可相交路径覆盖)
    https://loj.ac/problem/2574这个题目描述扎心了。简要题意:用n+1条可以相交的路径去覆盖DAG,使得没被覆盖的点的权值的最小值最大。首先二分答案,问题转换为有一些点一定要被覆盖,问n+1条路径内有没有解。这个可以暴力费用流,每个点拆成两个点,\(i->i',r=1\),如果这个点必选,则费用为inf,......
  • 9折半查找
    #include<stdio.h>voidMy_sort(intarr[],intsz){ inti=0; intj=0; for(i=0;i<sz-1;i++) { for(j=0;j<sz-i-1;j++) { if(arr[j]>arr[j+1]) { intt=arr[j]; arr[j]=arr[j+1]; arr[j+1]=t; } }......
  • 3、查找表相关问题
    1、两类查找问题2、两个数组的交集349-两个数组的交集......
  • 为啥我的Python这么慢 - 项查找 (二)
    根据那篇文章改了两处写法,如下(存储于readFaJoin2.py文件中):fromcollectionsimportdefaultdictaDict=defaultdict(list)forlineinopen("GRCh38.fa"):ifline[0]=='>':key=line[1:-1]else:aDict[key].append(line.strip())......
  • 二分查找——出现溢出问题
    算法描述:前提:有已排序数组A(假设已经做好)定义左边界L、右边界R,确定搜索范围,循环执行二分查找(3、4两步)获取中间索引M=Floor((L+R)/2)中间索引的值A[M]与待搜索的值T进行比较①A[M]==T表示找到,返回中间索引②A[M]>T,中间值右侧的其它元素都大于T,无需......
  • 如何在Linux中查找一个文件
    《Linux就该这么学》-必读的Linux系统与红帽RHCE认证免费自学书籍免费电子版下载地址:https://www.linuxprobe.com/book导读对于新手而言,在Linux中使用命令行可能会非常不方便。没有图形界面,很难在不同文件夹间浏览,找到需要的文件。本篇教程中,我会展示如何在Linux中查找特......
  • 【二分查找】LeetCode 33. 搜索旋转排序数组思路
    题目链接33.搜索旋转排序数组思路思路都在注释里代码classSolution{publicintsearch(int[]nums,inttarget){intlen=nums.length;if(len==0){return-1;}intleft=0,right=len-1;//1.......
  • 【二分查找】LeetCode 528. 按权重随机选择
    题目链接528.按权重随机选择思路代码classSolution{privateint[]sum;publicSolution(int[]w){sum=newint[w.length+1];for(inti=1;i<sum.length;i++){sum[i]=sum[i-1]+w[i-1];}}p......