首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

查找算法】折半查找

本篇文章将介绍折半查找算法。 文章目录 何为折半查找? 算法实现 递归实现 效率分析 何为折半查找?...上一篇文章介绍了顺序查找算法,我们知道,虽然顺序查找算法适用性高,但效率太低,那么能不能在此基础上继续提高算法的效率呢?...这个时候,折半查找诞生了,它的原理是每次都将待查找的记录所在的区间缩小一半,比如: 若要在该序列中查找元素值4,折半查找是如何做到的呢?...它需要先设置两个游标,一个指向最左边,一个指向最右边: 这两个游标所表示的范围即为查找区间,初始我们在下标为1到10的区间内查找,这个查找也是讲究方法的,不是一个一个地去遍历查找

1K20

查找算法之折半查找+分块查找

基本概念 查找表:由同一种类型的数据元素(记录)组成 静态查找表:只需要查找算法 动态查找表:除了查找,还需要增删改查数据元素 关键字:唯一标识数据元素的数据项 常见的查找算法 折半查找 概念 折半查找又称二分查找...如果当前LOW和HIGH之间有奇数个元素,则MID分割后,左右两部分元素个数相等 如果当前LOW和HIGH之间有偶数个元素,则MID分割后,左部分比右半部分少一个元素 折半查找的判定树中,若MID={...(LOW=HIGH)/2}向下取整,则对于任何一个节点,必有右子树结点数-左子树结点数=0或1 折半查找判定树必定是平衡二叉树 折半查找判定树中,只有最下面一层是不满的,因此元素个数为n时,树高h={log2...(n+1)}向下取整 失败结点:n+1(等于成功节点的空链域数量) 分块查找 分块查找,又称索引顺序查找,算法过程: 在索引表中确定待查记录所属的分块(可顺序,可折半) 在块中查找 若索引表中不包含目标关键字...,则折半查找索引表最终停在LOW>HIGH,要在LOW所指分块中查找

1.6K30

DS静态查找折半查找

题目描述 给出一个队列和要查找的数值,找出数值在队列中的位置,队列位置从1开始 要求使用折半查找算法 输入 第一行输入n,表示队列有n个数据 第二行输入n个数据,都是正整数,用空格隔开 第三行输入t...,表示有t个要查找的数值 第四行起,输入t个数值,输入t行 输出 每行输出一个要查找的数值在队列的位置,如果查找不成功,输出字符串error 输入样例1  8 11 22 33 44 55 66...77 88 3 22 88 99 输出样例1 2 8 error 思路分析 折半查找就是二分查找,,对于一个有序数列,通过三个位置的变换(low、mid、high),相当于部分顺序查找...,只不过每次把查找的范围缩小一半。...,如果比mid位置的小,那么说明数值有可能在low和mid之间,那么就让high=mid-1,mid=(low+high)/2,继续查找下去,直到mid位置上的就是要查找的数值,或者low>high,查找结束

14320

折半查找 解题报告

折半查找 解题报告 折半查找查找方法中的一种,常用的查找方法还有遍历查找折半查找运用了二分的思想,也可称为二分查找。...注意 由于数组a中可能会存在相等的元素,若要求输出k在数组a中第一次出现的位置,可以在第一次查找到与元素k相等的元素位置后,仍然调用二分查找函数,直到查找的范围是1,则此时便找到了元素k在数组a中第一次出现的位置...例题 题目描述 有n个数(n<=1000000),这n个数已按从大到小顺序存放在一个数组中,然后有T次查询,每次输入一个数,要求用折半查找法找出该数在数组中第一次出现的位置。...10 9 8 7 6 5 4 3 2 1 2 9 5 样例输出 2 6 这道题目是典型的折半查找题目,输出查找元素在数组中第一次出现的位置,编写折半查找函数,再进行递归调用即可。...(当题目中要求的数组空间比较大时,一定要第一时间想到这样申请空间) 2、在折半查找函数中,如何突显出查找的范围变为1了呢?

43130

经典折半查找算法

本文完整阅读需要的基础知识:循环结构,数组,函数,递归。 n个由小到大排好序的数,再给一个数x,判断这个数在数组中有没有出现过,如果有,就输出这个数在数组的位置,没有就输出”NO”....而用折半查找,开始的比较区间是1-6, 先取中间一个数,即第3个数6, 9比6大,说明在6的后面,下面就把区间变成4-6, 取中间数,即第5个数9,正好找到,这样总次数变成2次查找。...现在我们要完成这样的任务:如何在数组a的区间[first,last]内寻找key,其中a数组是有序的, 我们假设非降次序的(即:a[ first ] <= a[ first+1 ] <= … <= a[...last ] ) 中搜索key, 找到key时返回其在数组中的位置,否则返回-1 。...如果要查找有序数组里面的存在多个元素key, 要找到最左边的和最右边的位置呢? 留意一下:lower_bound 和 upper_bound 分别返回哪位置。

78130

折半查找部分有序

从这个思路无法判断,你明确表示出来 判断不了,你感觉没问题就是分析不出来呀 然后果断在换个思路 这个我一般不具备 不能在这里死磕 不然陷入了题目给造成的陷阱去了 Q1 有序数组折半是中间位置和查找元素...A2:为什么那相邻元素呢 为什么不用 array[end],array[begin] 一个数组假如有拐点 无法判断就不去判断了,继续拆分 如果一个数组不满足判断条件 继续拆分 满足到符合条件为止...步骤 step 1 选择中间位置 此时 数组将一份为二 A,B 一边是完全有序 部分A 一是包含旋转点部分B step 2 完全有序 部分A 查找非常简单 判断查找数据是否在有序数组A中 如果在...A中对范围A进行查找 step 3 如果没有A中 对B重复步骤 1 2 ?...{ //查找数据在完全有序数组A中 只要对数组A进行折半查找24.

61390

二分查找折半查找)法

二分查找的前提是数据一定要有序,否则一切皆为空谈。通过有序的一段数据使用二分查找较常规遍历查找算法速度要快一些。其中二分查找发有两种实现,一种为常规while循环,另外一种为递归。...若相等,则查找成功。否则利用中间位置将集合分成两个子集。 若中间元素大于目标元素,则在左子集中查找,否则在右子集中查找。 重复以上操作,直至找到要查找的元素,或是直到子集不存在查找的数据。...include #include int binarySearch(int *data, int low, int high, int find) { // 循环进行查找.../ 2; // 判断除2后的下标所对应的数据是否就是我们找的数据 // 如果是则直接返回 if (data[mid] == find) return mid; // 否则判断该下标对应的数据是否大于查找的数据...%d 的值是我们需要的数据 %d:\n”, find, arr[find]); system(“pause”); return 0; } 下图是根据以上代码制作的二分查找法的示例图,可参考学习:

17520

查找算法:二分查找法(折半查找)

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。...当然就是二分查找了: 二分查找猜数字 每次猜数字,都按照范围的一半进行猜测,例如 1-100范围,随机抽取55这个数字 折半查找猜50,大于50,那么这个数字的范围就缩小到了50-100, 继续猜测75...这样下去,原本100个数字,最多只需要log2n 次即可查出数据 100的数据,只需要最多8次即可查出 php代码实现 随机抽取 1-100 的一个数字,猜测这个数字是多少? <?...php //随机抽取1-100数字 $randNum = mt_rand(0,100); echo "实际值为:{$randNum}\n"; function guess($randNum,$minNum...,$maxNum,$guessNum=1){     //二分查找,除以2     $num = intval(($maxNum-$minNum)/2);     //中间值不能直接比较,需要再加上最小值

1.1K20

经典排序之折半查找

折半查找,又称二分法查找。意在一个有序的序列当中,从最大值与最小值开始,从两个值的中间值为分渠道,再次判断是否位于区间内,重复获取中间值,直至找到需要查找的值。...直到此,大概对与折半查找有这一定的理解了。...参数二:有序的数组 /* param{ key:待查找的值 arr:待查找数组 } */ var mysearch=function(key,arr){ var left=0; var...所以将第一个值定义为零,第二个值定义为数组的长度-1 var left=0; var right=arr.length-1; 定义一个循环,负责每次二分(折半查找。...return -1; 总结 折半查找(二分法)不仅仅是经典排序的问题,更是解决一些列数学问题的方法之一。其作用也不可小觑,日常生活中,包括娱乐游戏中也存在这类折半类型的娱乐活动。

23420

查找算法之顺序查找折半查找,二叉查找

,由于是顺序存储,所以将所有的数据元素存储在数组中,但是把第一个位置留给了用户用于查找的关键字。...折半查找   折半查找,也称二分查找,在某些情况下相比于顺序查找,使用折半查找算法的效率更高。但是该算法的使用的前提是静态查找表中的数据必须是有序的。   ...在折半查找之前对查找表按照所查的关键字进行排序的意思是:若查找表中存储的数据元素含有多个关键字时,使用哪种关键字做折半查找,就需要提前以该关键字对所有数据进行排序。...折半查找算法   对静态查找表{5,13,19,21,37,56,64,75,80,88,92}采用折半查找算法查找关键字为 21 的过程为: ?               ...折半查找的实现代码: /* * @Description: 折半查找.前提是静态查找表中的数据必须是有序的。

1.5K30

C语言函数二分查找(折半查找)

C语言函数二分查找(折半查找) 参考视频讲解哔哩哔哩比特鹏哥的视频 ——链接 二分查找 #include //二分查找 //在一个有序数组查找具体的某个数 //如果找到了返回...,这个数的下标,找不到返回-1 //例如我要在这个数组中找到7 //首先找到这组被查找元素的中间的元素 //假如说发现中间元素5要比我要找的数要小 //说明我要找的数在5的右边,这样我的范围就缩小了一半...//查找了一次范围就缩小了一半,这样的速度是比较快的 //这就叫二分查找(折半查找) //那么怎么找到中间元素的下标呢 //原来的数组是1 2 3 4 5 6 7 8 9 10 //他们的下标是...return -1;//返回去了 } } int main(void) { int arr[] = {1,2,3,4,5,6,7,8,9,10}; int k = 7; //只要把数组传参传过去...//在内部是不能再上面的方式求元素个数了 //数组是一块连续的空间,他里面可以放很多个元素 //数组在传参的时候 int ret = number_search(arr, k);//在这里仅仅传的是数组第一个元素的地址

84820
领券