折半查找
- 格式:doc
- 大小:46.50 KB
- 文档页数:5
先看看这个,下面有例子折半查找:二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。
因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。
重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
算法要求算法复杂度下面提供一段二分查找实现的伪代码:BinarySearch(max,min,des)mid-<(max+min)/2while(min<=max)mid=(min+max)/2if mid=des thenreturn midelseif mid >des thenmax=mid-1elsemin=mid+1return max折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。
它的基本思想是,将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。
如果x<a[n/2],则我们只要在数组a的左半部继续搜索x(这里假设数组元素呈升序排列)。
如果x>a[n/2],则我们只要在数组a的右半部继续搜索x。
二分查找法一般都存在一个临界值的BUG,即查找不到最后一个或第一个值。
可以在比较到最后两个数时,再次判断到底是哪个值和查找的值相等。
C语言代码int BinSearch(SeqList * R,int n , KeyType K ){ //在有序表R[0..n-1]中进行二分查找,成功时返回结点的位置,失败时返回-1int low=0,high=n-1,mid;//置当前查找区间上、下界的初值if(R[low].key==K){return low ;}if(R[high].key==k)return high;while(low<=high){ //当前查找区间R[low..high]非空mid=low+((high-low)/2);//使用(low + high) / 2 会有整数溢出的问题(问题会出现在当low + high的结果大于表达式结果类型所能表示的最大值时,这样,产生溢出后再/2是不会产生正确结果的,而low+((high-low)/2)不存在这个问题if(R[mid].key==K){return mid;//查找成功返回}if(R[mid].key>K)high=mid-1; //继续在R[low..mid-1]中查找elselow=mid+1;//继续在R[mid+1..high]中查找}if(low>high)return -1;//当low>high时表示查找区间为空,查找失败} //BinSeareh折半查找程序举例程序要求:1.在main函数中定义一个20个元素的int数组,完成初始化和显示操作。
二分法查找1、二分查找(Binary Search)二分查找又称折半查找,它是一种效率较高的查找方法。
二分查找要求:线性表是有序表,即表中结点按关键字有序,并且要用向量作为表的存储结构。
不妨设有序表是递增有序的。
2、二分查找的基本思想二分查找的基本思想是:(设R[low..high]是当前的查找区间)(1)首先确定该区间的中点位置:(2)然后将待查的K值与R[mid].key比较:若相等,则查找成功并返回此位置,否则须确定新的查找区间,继续二分查找,具体方法如下:①若R[mid].key>K,则由表的有序性可知R[mid..n].keys均大于K,因此若表中存在关键字等于K的结点,则该结点必定是在位置mid左边的子表R[1..mid-1]中,故新的查找区间是左子表R[1..mid-1]。
②类似地,若R[mid].key<K,则要查找的K必在mid的右子表R[mid+1..n]中,即新的查找区间是右子表R[mid+1..n]。
下一次查找是针对新的查找区间进行的。
因此,从初始的查找区间R[1..n]开始,每经过一次与当前查找区间的中点位置上的结点关键字的比较,就可确定查找是否成功,不成功则当前的查找区间就缩小一半。
这一过程重复直至找到关键字为K的结点,或者直至当前的查找区间为空(即查找失败)时为止。
3、二分查找算法int BinSearch(SeqList R,KeyType K){ //在有序表R[1..n]中进行二分查找,成功时返回结点的位置,失败时返回零int low=1,high=n,mid;//置当前查找区间上、下界的初值while(low<=high){ //当前查找区间R[low..high]非空mid=(low+high)/2;if(R[mid].key==K) return mid;//查找成功返回if(R[mid].kdy>K)high=mid-1; //继续在R[low..mid-1]中查找elselow=mid+1;//继续在R[mid+1..high]中查找}return 0;//当low>high时表示查找区间为空,查找失败} //BinSeareh二分查找算法亦很容易给出其递归程序【参见练习】4、二分查找算法的执行过程设算法的输入实例中有序的关键字序列为(05,13,19,21,37,56,64,75,80,88,92)要查找的关键字K分别是21和85。
折半查找的判定树的构造方法折半查找,也被称为二分查找,是一种在有序数组中查找特定元素的算法。
构造折半查找的判定树可以帮助理解算法的执行过程。
下面是关于构造折半查找判定树的50条方法,并且会对每一条进行详细描述。
1. 在有序数组中选择中间元素作为根节点。
构造方法详解:我们在有序数组中选择中间元素作为根节点。
这个中间元素是数组中间位置的值。
这一步是构造判定树的第一步,因为它将分割数组成左右两个子数组。
2. 在根节点的左侧选择一个中间元素作为左子树的根节点。
构造方法详解:在根节点的左侧选择一个中间元素,作为左子树的根节点。
这个中间元素是根节点左侧子数组的中间位置的值。
这一步扩展了判定树,使得左侧的子数组也可以进行折半查找。
3. 在根节点的右侧选择一个中间元素作为右子树的根节点。
构造方法详解:同样地,在根节点的右侧选择一个中间元素,作为右子树的根节点。
这个中间元素是根节点右侧子数组的中间位置的值。
这一步扩展了判定树,使得右侧的子数组也可以进行折半查找。
4. 重复以上过程,依次构造左右子树。
构造方法详解:依次对左右子树进行重复的选择中间元素作为子树的根节点的过程。
这样不断地构造子树,直到数组中的每个元素都被考虑到。
5. 当子数组中只剩下一个元素时,将其作为叶子节点添加到判定树中。
构造方法详解:当子数组中只剩下一个元素时,将其作为叶子节点添加到判定树中。
这表示整个有序数组的判定树构造完成。
因为此时的子数组不再能够被分割,所以将其作为叶子节点。
6. 对每个子数组的根节点和叶子节点进行连接,构成完整的判定树结构。
构造方法详解:对每个子数组的根节点和叶子节点进行连接,构成完整的判定树结构。
这意味着将每个子数组的根节点和叶子节点沿着判定树的路径连接起来,形成一棵完整的树结构。
7. 确定根节点、左右子树的取值范围,并进行标记。
构造方法详解:对于每个节点,包括根节点和叶子节点,需要确定其对应的子数组的取值范围,并进行标记。
二分查找查找次数题目
二分查找,也被称为折半查找,是一种高效的查找算法。
它的核心思想是将查找区间分为两部分,并将目标值与中间元素进行比较,从而缩小查找范围。
在每一次比较后,根据目标值与中间元素的大小关系,可以确定目标值可能存在的位置,从而加快查找速度。
这道题目要求计算使用二分查找算法查找目标值的次数。
实际上,二分查找的次数是取决于查找区间的大小。
每一次比较后,我们可以将查找区间缩小一半。
所以,如果初始查找区间的大小为n,那么最多需要log₂n次比较来找到目标值(其中log₂代表以2为底的对数)。
具体计算查找次数的方法如下:
1. 首先,确定初始查找区间的大小,比如n。
2. 然后,根据上述的公式计算出log₂n。
3. 对计算结果进行向上取整,得到最终的查找次数。
举个例子说明:假设目标值为x,初始查找区间为1到100,那么初始查找区间的大小为100-1+1=100,计算得到log₂100 ≈ 6.64,向上取整得到7。
因此,使用二分查找算法查找目标值x时,最多需要进行7次比较。
总之,这道题目要求计算二分查找算法查找目标值的次数,通过计算查找区间的大小并应用对数运算的方法,可以得到准确的查找次数。
二分查找算法因其高效性而被广泛应用于各种查找问题中。
折半查找法的查找速度一定比顺序查找法快。
不能笼统的说那个算法一定就好,算法分析要看条件和模型。
折半算法要求待查区域数据是已经排好序的,但是顺序查找没这个要求。
算法时间分析要看平均情况、最坏情况、最好情况的。
最好情况两者
时间一样,因为都是比较方法查找,都假定第一次比较就找到。
最坏情况,折半查找更优为log n次比较,而顺序查找为n次比较。
平均情况下(所
有待查元素查找概率相当),一般是折半查找由于顺序查找(O(log n) < O(n))。
一般数据规模稍大的测试、算法练习题,折半查找表现都很好,常常
优于顺序查找,毕竟顺序查找算不上什么高等算法,优化空间很小。
但是,实际的查找操作很复杂,并不是查找数量多了就会趋近于平均
情况,而且折半查找又要求有排序,所以仍然需要按照系统需求进行相应
的数学分析和实际检测。
折半查找的概念
折半查找(Binary Search)是一种常用的查找算法,它适用于已排序的数组或列表。
折半查找通过反复将查找范围折半直至找到指定元素或确定元素不存在,具有高效和简单的特点。
具体实现过程如下:首先,算法将查找范围的中间点与目标元素进行比较,如果相等,则返回该元素的下标;如果目标元素小于中间元素,则折半查找左半部分;如果目标元素大于中间元素,则折半查找右半部分。
这个过程不断重复,直到找到目标元素或确定目标元素不存在。
折半查找的时间复杂度为O(log n),其中n为查找范围的元素个数。
它的优点是它的效率高,适用于大数据集的查找,缺点是需要先对数据进行排序,如果数据量很小,使用折半查找的效率并不高。
二分查找法,也称为折半查找法,是一种在有序数组中查找特定元素的算法。
它的要求如下:
1. 数组必须是有序的:二分查找法只能在有序数组中进行查找,如果数组无序,需要先进行排序。
2. 数组必须是静态的:二分查找法适用于静态数组,即不会频繁插入或删除元素的数组。
如果数组需要频繁修改,建议使用其他数据结构。
3. 数组元素必须可比较:二分查找法依赖于元素之间的比较操作,因此数组元素必须支持比较操作。
对于自定义类型的元素,需要实现比较操作符。
4. 查找范围必须确定:二分查找法需要明确查找范围的起始和结束位置,通常使用两个指针来表示。
5. 查找范围必须缩小:二分查找法通过不断缩小查找范围来逼近目标元素,直到找到目标元素或确定目标元素不存在。
总结起来,二分查找法的要求是有序数组、静态数组、可比较元素、确定查找范围和缩小查找范围。
折半查找算法及程序实现教案教案:折半查找算法及程序实现一、教学目标1.了解折半查找算法的原理和流程;2.掌握折半查找算法的程序实现;3.能够分析和评估折半查找算法的时间复杂度。
二、教学内容1.折半查找算法的原理和流程;2.折半查找算法的程序实现;3.折半查找算法的时间复杂度分析。
三、教学过程1.导入,引入折半查找算法的背景和应用场景。
(5分钟)2.讲解折半查找算法的原理和流程。
(10分钟)折半查找算法,也称为二分查找算法,是一种分治思想的算法。
其运行时要求待查找数据必须是有序的。
基本思想是将待查找的数据与中间位置的数据进行比较,若相等则查找成功,若不相等则根据大小关系在前半部分或后半部分查找,如此不断缩小查找范围,直到找到目标元素或查找范围为空。
1)取查找范围的首尾元素确定中间位置元素,并与目标元素进行比较;2)若中间位置元素与目标元素相等,则查找成功,返回中间位置;3)若中间位置元素大于目标元素,则在前半部分继续查找,重复步骤1);4)若中间位置元素小于目标元素,则在后半部分继续查找,重复步骤1);5)若找到目标元素,则返回其位置,否则返回查找失败。
3.分组讨论与实践。
(15分钟)将学生分成若干小组,让每个小组分别完成以下任务:-根据讲解的折半查找算法原理,结合自己的理解,用自然语言描述折半查找算法;-编写折半查找算法的递归实现;-编写折半查找算法的非递归实现;-利用给定的有序数组,测试实现的算法是否正确。
4.小组展示与讨论。
(15分钟)每个小组派代表上台展示他们的实现,并陈述实现的思路和步骤。
其他小组可对其实现进行评议和提问,共同讨论折半查找算法的优化和改进。
5.整合和总结。
(10分钟)将小组讨论的结果整合起来,总结折半查找算法的特点和程序实现的要点。
6.展示折半查找算法的时间复杂度分析。
(10分钟)通过一张时间复杂度的图示,讲解折半查找算法的时间复杂度是log(n)级别的,并与线性查找算法进行对比,强调折半查找算法的高效性。
折半查找法例题
折半查找法,也称为二分查找法,是一种查找有序数组中特定元素的高效算法。
它通常比线性查找更快,因为它可以将搜索范围缩小一半。
下面是一个折半查找法的例题:
假设有一个有序数组:[1, 3, 5, 7, 9, 11, 13, 15, 17, 19],请使用折半查找法查找数字13的位置。
解题步骤如下:
1. 定义左右指针l和r,分别指向数组的开头和结尾。
2. 计算出中间位置mid,也就是(l + r) / 2。
3. 比较中间位置mid上的元素和目标元素13的大小关系。
4. 如果中间位置上的元素比目标元素要大,说明目标元素可能在左半边,将右指针r更新为mid - 1。
5. 如果中间位置上的元素比目标元素要小,说明目标元素可能在右半边,将左指针l更新为mid + 1。
6. 重复步骤2-5,直到找到目标元素或者左右指针相遇为止。
7. 如果左右指针相遇且相遇位置上的元素不是目标元素,则说明目标元素不在数组中。
根据上述步骤,我们可以得出结论,数字13在数组中的位置是6,也就是数组的第7个元素。
- 1 -。
C语言二分查找算法及实现代码二分查找算法(Binary Search Algorithm)也被称为折半查找算法,是一种常见的查找算法。
它的原理是将有序数组(或有序列表)从中间划分为两部分,然后将待查找元素与中间元素进行比较,如果相等则返回元素的索引;如果待查找元素较大,则在右半部分继续查找;如果待查找元素较小,则在左半部分继续查找,直到找到目标元素或者确定目标元素不存在为止。
二分查找算法的时间复杂度为O(log n),其中n是数组的长度。
相比于顺序查找算法的时间复杂度O(n),二分查找算法具有更高的效率。
下面是用C语言实现二分查找算法的代码:```c#include <stdio.h>int binarySearch(int arr[], int left, int right, int target) while (left <= right)int mid = (left + right) / 2;if (arr[mid] == target)return mid;}else if (arr[mid] < target)left = mid + 1;elseright = mid - 1;}}return -1;int mai//假设有一个有序数组int arr[] = {2, 7, 14, 19, 26, 33, 41, 55, 68, 77}; int n = sizeof(arr) / sizeof(arr[0]); // 数组长度int target = 33; // 目标元素int result = binarySearch(arr, 0, n - 1, target); if (result == -1)printf("目标元素不存在\n");}elseprintf("目标元素的索引是%d\n", result);}return 0;以上代码中,binarySearch函数接收一个有序数组、左右索引和目标元素作为参数。
二分查找平均查找长度
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。
但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
二分查找的查找过程:
首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。
重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
二分查找的时间复杂度:
二分查找的时间复杂度是O(log2(n+1)−1)。
二分法查找元素公式(二)二分法查找元素公式1. 什么是二分法查找?二分法是一种基于比较的查找算法,也称为折半查找。
它是针对已排好序的数组进行查找的一种高效算法。
2. 二分法查找的原理二分法查找的原理是通过将要查找的范围分成两半,每次取中间位置的元素与目标值进行比较,根据比较的结果来确定下一次查找的范围,从而将查找范围逐渐缩小,直到找到目标值或者确定目标值不存在。
3. 二分法查找的公式二分法查找的公式如下:mid = (low + high) / 2其中,low表示当前查找范围的最小索引,high表示当前查找范围的最大索引,mid表示当前查找范围的中间索引。
4. 二分法查找的步骤二分法查找的步骤如下:•初始化low和high分别为数组的第一个索引和最后一个索引;•循环直到low大于high:–计算mid的值;–如果mid对应的元素等于目标值,则返回mid;–如果mid对应的元素小于目标值,则更新low为mid+1;–如果mid对应的元素大于目标值,则更新high为mid-1;•返回 -1,表示目标值不存在于数组中。
5. 举例说明假设有以下有序数组[1, 3, 5, 7, 9, 11, 13, 15, 17, 19],我们要查找数字9。
•初始时,low为0,high为9;•第一次循环,计算mid = (0 + 9) / 2 = 4,数组中索引为4的元素为9,找到目标值;•返回4。
通过二分法查找,我们可以快速定位到目标值9的位置。
6. 总结二分法查找是一种高效的查找算法,它的公式为mid = (low + high) / 2。
通过将查找范围逐渐缩小,可以快速找到目标值。
在处理大规模的有序数组查找时,二分法查找是一种常用的方法。
降序存储的一组整数(10个),任意输入一个数,用折半查找法找出该数的
位置。
折半查找法是一种有效的查找算法,能够实现快速且精准的查找指定元素的位置。
它的基本规则就是:将查找区间的中间元素的值和要查找的关键字比较,如果相等,则查找成功;若小于要查找的关键字,则将查找区间缩小为原来的左半部分;若大于关键字,则将查找区间缩小为原来的右半部分。
这种方式可使查找区间每次减少二分之一,同时也将查找元素的位置困难度降低,从而达到较高效率并快速找到元素,而无需遍历整个数组。
假设现在我们有一个降序排列的数组(10个元素),任意输入一个数,我们可以使用折半查找法来快速查找到该数字在数组中的位置。
首先,我们需要找到数组中间的位置,即索引号为5,当输入的数小于或等
于数组索引号5的元素时,我们可以将查找区间缩小为原来数组的左半部分,否则将查找区间缩小为原来数组的右半部分。
然后,重复上述操作,直到找到要查找的数字,从而确定数字在数组中的位置。
由于折半查找法每次剔除大量无效的查找元素,因此经过几次查找可以较快的找到目标数字的位置,大大提高了查找的工作效率。
数据结构50:⼆分查找法(折半查找法)折半查找,也称⼆分查找,在某些情况下相⽐于顺序查找,使⽤折半查找算法的效率更⾼。
但是该算法的使⽤的前提是静态查找表中的数据必须是有序的。
例如,在{5,21,13,19,37,75,56,64,88 ,80,92}这个查找表使⽤折半查找算法查找数据之前,需要⾸先对该表中的数据按照所查的关键字进⾏排序:{5,13,19,21,37,56,64,75,80,88,92}。
在折半查找之前对查找表按照所查的关键字进⾏排序的意思是:若查找表中存储的数据元素含有多个关键字时,使⽤哪种关键字做折半查找,就需要提前以该关键字对所有数据进⾏排序。
折半查找算法对静态查找表{5,13,19,21,37,56,64,75,80,88,92}采⽤折半查找算法查找关键字为 21 的过程为:图 1 折半查找的过程(a)如上图 1 所⽰,指针 low 和 high 分别指向查找表的第⼀个关键字和最后⼀个关键字,指针 mid 指向处于 low 和 high 指针中间位置的关键字。
在查找的过程中每次都同 mid 指向的关键字进⾏⽐较,由于整个表中的数据是有序的,因此在⽐较之后就可以知道要查找的关键字的⼤致位置。
例如在查找关键字 21 时,⾸先同 56 作⽐较,由于21 < 56,⽽且这个查找表是按照升序进⾏排序的,所以可以判定如果静态查找表中有 21这个关键字,就⼀定存在于 low 和 mid 指向的区域中间。
因此,再次遍历时需要更新 high 指针和 mid 指针的位置,令 high 指针移动到 mid 指针的左侧⼀个位置上,同时令 mid 重新指向 low 指针和 high 指针的中间位置。
如图 2 所⽰:图 2 折半查找的过程(b)同样,⽤ 21 同 mid 指针指向的 19 作⽐较,19 < 21,所以可以判定 21 如果存在,肯定处于 mid 和 high 指向的区域中。
所以令 low 指向 mid 右侧⼀个位置上,同时更新 mid 的位置。
头歌实现折半查找参考答案头歌实现折半查找参考答案在计算机科学中,查找是一项基本的操作。
而折半查找是一种高效的查找算法,也被称为二分查找。
本文将介绍一种名为"头歌"的实现折半查找的方法。
折半查找是一种在有序数组中查找目标元素的算法。
它的基本思想是将数组分成两部分,然后判断目标元素与数组中间元素的大小关系,进而确定目标元素在哪一部分。
然后再在这一部分中进行递归或迭代查找,直到找到目标元素或确定目标元素不存在。
"头歌"是一种基于折半查找的实现方法,它的名字源自于折半查找的英文单词"binary search"的谐音。
"头歌"的特点是在查找过程中,每次都将数组的头部作为中间元素,而不是数组的中间元素。
这种方法的目的是为了减少每次查找时需要计算中间元素的开销。
具体实现"头歌"折半查找的步骤如下:1. 首先,将有序数组按照从小到大的顺序排列。
2. 设定目标元素为target。
3. 初始化左边界left为0,右边界right为数组长度减1。
4. 进入循环,直到左边界大于右边界为止。
5. 在每次循环中,计算中间元素的下标mid为(left+right)/2。
6. 判断目标元素与中间元素的大小关系,如果相等,则找到目标元素,返回下标。
7. 如果目标元素小于中间元素,则将右边界right更新为mid-1。
8. 如果目标元素大于中间元素,则将左边界left更新为mid+1。
9. 重复步骤5至8,直到找到目标元素或确定目标元素不存在。
10. 如果循环结束仍未找到目标元素,则返回-1表示目标元素不存在。
"头歌"折半查找的时间复杂度为O(logn),其中n为数组长度。
这是因为每次循环都将数组的长度缩小一半,直到找到目标元素或确定目标元素不存在。
虽然"头歌"实现折半查找的方法在计算中间元素时会有一定的开销,但由于每次查找都是在数组的头部进行,可以减少每次查找时需要移动指针的次数,从而提高查找效率。
C语言程序设计100例之(21):折半查找例21 折半查找问题描述顺序查找是一种最简单和最基本的检索方法。
其基本思想是:从检索表的一端(如表中第一个记录或最后一个记录)开始,逐个进行记录的关键字和给定值的比较。
若某个记录的关键字和给定值比较相等,则查找成功;否则,若直至检索表的另一端(如最后一个记录或第一个记录),其关键字和给定值比较都不等,则表明表中没有待查记录,查找不成功。
顺序查找可以写成一个简单的一重循环,循环中依次将检索表(不妨设为数组a)中的元素与给定值比较,若相等,用break退出循环。
算法描述为:for (i=0; i< n;i++)if (a[i]==x) break;这样,循环结束后,若循环控制变量i小于数组元素个数n,则查找成功;否则,查找失败。
顺序查找实现简单,但效率不高。
当待查找序列有序时,即各检索表中元素的次序是按其记录的关键字值的大小顺序存储的。
此时采用折半查找会大幅提高查找效率。
折半查找的基本思想是先确定待查数据的范围(区间),然后逐步缩小范围直到找到或找不到该记录为止。
具体做法是:先取数组中间位置的数据元素与给定值比较。
若相等,则查找成功;否则,若给定值比该数据元素的值小(或大),则给定值必在数组的前半部分(或后半部分),然后在新的查找范围内进行同样的查找。
如此反复进行,直到找到数组元素值与给定值相等的元素或确定数组中没有待查找的数据为止。
因此,折半查找每查找一次,或成功,或使查找数组中元素的个数减少一半,当查找数组中不再有数据元素时,查找失败。
输入一个整数,在给定的有序数组中查找该整数是否存在,若存在,给出其数组的下标;若不存在,输出查找不成功信息。
输入格式第一行是一个正整数N (1 ≤N ≤100000),代表数组中元素的个数。
第二行有N个整数,这N个整数从小到大排列好了。
第三行是一个整数M,代表待查找元素的个数。
接下来的M行,每行有一个整数x,表示每个待查找的元素。
折半查找原理
嘿,朋友们!今天咱来聊聊折半查找原理呀!这玩意儿就像是在一个大宝藏里找宝贝。
你想啊,假如你有一堆乱七八糟的东西,要找其中一个特定的玩意儿,你会咋办?总不能一个一个瞎翻吧,那得找到啥时候呀!折半查找就聪明多啦。
它就像是你有一把神奇的尺子,一下子把这堆东西分成两半。
然后呢,你看看你要找的宝贝在左边那堆还是右边那堆。
如果在左边,那好呀,右边那堆就可以先不管啦,就专门对付左边这堆。
然后再把左边这堆又分成两半,继续这么找下去。
这多有意思呀!就好像你在走迷宫,每次都能找到最有可能的那条路。
你说,这是不是比瞎转悠强多啦?
咱再打个比方,你去图书馆找一本书。
要是没有折半查找,那你不得在那一排排书架上挨个找呀,那得累个半死。
可要是用了折半查找呢,就像你知道了一个小窍门,一下子就能缩小范围,快速找到那本书的大概位置。
折半查找不就是这样嘛,它能让你快速地在一堆数据里找到你想要的那个。
而且呀,它还特别靠谱,只要数据是有序的,它就像个小侦探一样,准能把目标给揪出来。
你说这折半查找是不是很神奇?它就像一把钥匙,能打开那扇通往目标的门。
你想想看,要是没有它,我们得费多大的劲呀!
在生活中,我们不也经常需要这样快速找到目标的方法吗?比如说找东西呀,找信息呀。
折半查找原理就像是我们的好帮手,让我们的寻找变得更加高效。
所以呀,大家可别小瞧了这个折半查找原理,它可是有着大用处呢!学会了它,就好像你多了一项超能力,能在数据的海洋里畅游无阻,快速找到你想要的宝贝!难道不是吗?。
//此程序是折半查找的详细算法实现
#include<iostream>
using namespace std;
void CreateData(int data[],int length);//为一个数组赋值
//此函数是折半查找函数。
其中data是所查寻的数组,length是数组的长度。
x是所要查找的数,返回的值是数据x在数组中的位置
int Bisearch(int data[],int x,int begin,int last);//折半查找函数,使用过程中只需要给出数组名字,要查找的数值x,数组的起始位置begin及莫位置即可。
void PrintData(int data[],int length);//输出一个数组的所有元素。
void main()
{
//声明一个数组data[10],并调用CreateData()函数为该数组赋值。
int data[10];
CreateData(data,10);
//调用PrintData()函数输出data的值。
PrintData(data,10);
loop:
//定义一个整形变量用于接收用于要查找的数值,并提示用于输入该值
int x;
cout<<"请输入你要查找的值:";
cin>>x;
system("cls");
PrintData(data,10);
//调用函数Bisearch()函数查找用于输入的x在数组中的元素。
int loaction = Bisearch(data,x,0,9);
//首先判断是否查找成功
if( loaction == -1)
{
cout<<"查找失败,没有你要查找的值"<<endl;
}
//当查找成功的情况下输出用户值所在的位置。
else
{
cout<<"你要查找的值"<<x<<"的位置在第:"<<loaction+1<<"个位置!"<<endl;
}
goto loop;
}
//生成数据函数的定义。
void CreateData(int data[],int length)
{
for(int i=0;i<length;i++)
{
data[i] =i;
}
}//void CreateData(int data[],int length)
void PrintData(int data[],int length)
{
cout<<"你所要输出的数组的元素有:";
for (int i=0;i<length;i++)
{
cout<<data[i]<<" ";
}
cout<<endl;
}//void PrintData(int data[],int length)
//实现折半查找函数
int Bisearch(int data[],int x,int begin ,int last)
{
//判断是不是只有一个元素可以比较了。
if (begin >last)
{
return -1;
exit(0);
}
int mid=(begin + last) /2;
//如果x与数组中data[mid]的值相等,则查找成功,本函数执行完毕。
if (x == data[mid])
{
return mid;
exit(0);
}
//当x>data[mid]的时候,则进行作面查找数据x。
采用递归方法实现。
if ( x < data[mid] )
{
Bisearch(data,x,begin ,mid-1);
}
//如果x<data[mid]的情况下,即往数组的有半部分扫描数组。
else
{
Bisearch(data,x,mid+1 ,last);
}
}
折半查找法的两种实现
折半查找法:
在有序表中,把待查找数据值与查找范围的中间元素值进行比较,会有三种情况出现:
1)待查找数据值与中间元素值正好相等,则放回中间元素值的索引。
2)待查找数据值比中间元素值小,则以整个查找范围的前半部分作为新的查找范围,执行1),直到找到相等的值。
3)待查找数据值比中间元素值大,则以整个查找范围的后半部分作为新的查找范围,执行1),直到找到相等的值
4)如果最后找不到相等的值,则返回错误提示信息。
按照二叉树来理解:中间值为二叉树的根,前半部分为左子树,后半部分为右子树。
折半查找法的查找次数正好为该值所在的层数。
等概率情况下,约为
log2(n+1)-1
[cpp]view plaincopy。