实验二 折半查找算法设计
折半查找(二分查找)

折半查找(⼆分查找)折半查找(⼆分查找)(1)定义以及思想(有序)折半查找法是效率较⾼的⼀种查找⽅法。
假设已经按照从⼩到⼤的顺序排列好的五个整数a0-a4,要查找的数是X,其基本思想是:设查找数据的范围下限为l=1,上限为l=5,求中点m=(1+h)/2,⽤x与中点元素am⽐较,若x=am,即找到,停⽌查找;否则,若x>am,替换下限l=m+1,到下半段继续查找;若x<am,即换上限h=m-1,到上半段继续查找,如此重复前⾯的过程直到找到或者l>h为⽌。
如果l>h,说明没有此数,打印找不到信息,程序结束(2)算法的实现//⼆分查找必须是有顺序的#include<stdio.h>int BinSearch(int *a,int n,int x);int main(void){int num,result;int arr[] = {1,2,3,4,5,6,7,8,9,10};printf("请输⼊你要查找的数据:");scanf("%d",&num);result=BinSearch(arr,10,num);if(result==-1)printf("没找到这个数据\n");elseprintf("在下标为%d的位置找到这个数num=%d\n",result,num);return 0;}int BinSearch(int *a,int n,int x){int low,high,mid;low=0;high = n-1;while(low<=high){//其中mid = (low+high)/2这个的位置。
因为在外部函数中并不能确定是否low⼀定⼩于high的mid = (low+high)/2;if(x>a[mid])low = mid+1;else if(x<a[mid])high = mid -1;elsereturn mid;}return -1; }。
算法分析与设计-实验二 二分查找实验报告

南阳理工学院算法分析与设计实验报告册开课学院:计算机与软件学院实验项目:实验2:二分查找实验时间:第6周周3(3,4)节实验地点: 15#515指导教师:学生姓名:学生学号:专业班级:2020-2021学年第1学期一、实验目的1.掌握分治算法的基本设计思路、适用条件2.非递归实现二分查找3.递归实现二分查找二、实验平台1.JDK1.82.IDEA三、实验内容1.二分查找:给定N个数据和待查找的数据x,采用二分查找算法来搜索x,输出x在N个数据中的位置。
四、算法设计1.问题分析根据问题需求可知,给定N个数据和待查找的数据X,使用二分查找算法来搜索x。
要使用二分查找算法,需要使数据有序,故可以将产生的数据进行排序(升序),之后取中间值记为data[mid]与x进行比较,如果x大于data[mid]则向数据的右侧再取mid进行比较问题的终止条件为左指针>右指针2.算法描述二分查找法(Binary Search)算法,也叫折半查找算法。
二分查找针对的是一个有序的数据集合,查找思想有点类似于分治思想。
每次都通过跟区间的中间元素对比,将带查找的区间缩小为之前的一半,知道找到要查找的元素,或者区间被缩小为0。
二分查找是一种非常非常高效的查询算法,时间复杂度为O(logn)。
3.算法求解步骤第一步:对原数据data进行排序第二步:设立左右指针left和right,左指针指向数组头部、右指针指向数组尾部第三步:根据left和right计算出mid,并判断data[mid]与目标值target的大小第四步:如果data[mid]大于target,则向右侧搜寻改变left指针值第五步:如果data[mid]小于target,则向左搜寻改变right指针值第六步:算法终止条件为找到target元素或者left>right四、算法源码public class BinarySearch {public static void main(String[] args) {int[] data = getData(10);System.out.println(Arrays.toString(data));// binarySearch_NotRecursion(data,data[9]);binarySearch_Recursion(data,data[3],0,data.length - 1);}// 生成待查找数据有序public static int[] getData(int length){Random random = new Random();int[] data = new int[length];for(int i = 0;i<length;i++){data[i] = random.nextInt(10*length);}Arrays.sort(data);return data;}// 二分查找非递归形式public static void binarySearch_NotRecursion(int[] data,int target){int left = 0;int right = data.length - 1;while(left <= right){int mid = (left + right) / 2;if (data[mid] == target){System.out.println("查找到需要的元素:"+data[mid]+",在原数组中的下标为:"+mid);return;}else if (data[mid] < target){left = mid + 1;}else if (data[mid] > target){right = mid - 1;}}System.out.println("未找到需要搜索的元素");}// 二分查找递归式public static void binarySearch_Recursion(int[] data,int target,int left,int right){if (left > right){System.out.println("未找到需要搜索的元素");五、测试数据由程序生成伪随机数进行测试[23, 28, 28, 39, 47, 72, 75, 77, 83, 92] 39查找到需要的元素:39,在原数组中的下标为:3[6, 16, 19, 22, 43, 64, 66, 78, 80, 90] 22查找到需要的元素:22,在原数组中的下标为:3 [15, 25, 54, 55, 70, 80, 83, 84, 87, 95] 95查找到需要的元素:95,在原数组中的下标为:9[5, 23, 40, 48, 48, 54, 56, 68, 76, 84] 10000 未找到需要搜索的元素六、程序运行结果(要求:截图说明算法运行的结果)测试1:(递归方式)测试2:(非递归方式)八、实验总结1.实验中遇到的问题及解决方法所遇问题:程序设计阶段递归方式最初每次都将数组截取指定部分进行查找,最终得到的结果难以获取目标元素在原数组的下标解决方法:在每次递归时将整个完整数组作为参数递归,但每次限定left和right的值,逻辑上将数组划分为左右部分2.实验收获了解到二分查找的算法思想学会二分查找的基本简单使用。
折半搜索实验报告

软件学院数据结构课程设计报告设计题目: 折半搜索学号姓名年级专业软件工程班级学期日期: 年月日设计报告内容大纲:需求描述:a. 结合课程学习内容和自己理解设计功能,准确演示算法思想。
支持演示中间过程。
能单步演示。
b.软件要易用。
c.软件可以对输入用例案例重复演示。
d.输入的用例数据可编辑。
e. 软件要健壮,对非法的输入能给出合适的提示,不能直接导致软件崩溃。
实现思想:折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小于该中点元素,则将待查序列缩小为左半部分,否则为右半部分。
通过一次比较,将查找区间缩小一半。
折半查找是一种高效的查找方法。
它可以明显减少比较次数,提高查找效率。
但是,折半查找的先决条件是查找表中的数据元素必须有序。
数据结构设计:1. 首先确定整个查找区间的中间位置mid = ( left + right )/ 22. 用待查关键字值与中间位置的关键字值进行比较,若相等,则查找成功,若大于,则在后(右)半个区域继续进行折半查找,若小于,则在前(左)半个区域继续进行折半查找3. 对确定的缩小区域再按折半公式,重复上述步骤。
最后,得到结果:要么查找成功,要么查找失败。
折半查找的存储结构采用一维数组存放。
功能设计:1.单步执行,可显示算法实现全过程。
2.随机生成数组。
3.可选数组元素个数。
4.可重复执行运行环境说明:java系统测试用例收获及体会通过这次的程序设计增强了我的动手能力,修改程序中错误的能力。
让我深刻的感受到做一个程序首先要满足客户的要求,程序要简便,易操作,要完全考录到别人应用的感受。
数据结构实验报告折半查找

数据结构实验报告折半查找1. 引言数据结构是计算机科学中非常重要的一门课程,它研究的是数据的组织方式、存储结构和算法设计等内容。
在数据结构中,折半查找(Binary Search)是一种常用的查找算法,可以在有序的数据集合中快速找到目标元素。
本实验报告将介绍折半查找算法的原理、实现过程以及在不同数据规模下的性能分析。
2. 折半查找原理折半查找是一种分而治之的算法,通过比较目标元素与中间元素的大小关系,不断将待查找范围缩小一半,并在所需的时间内逐步逼近目标元素。
具体的折半查找算法如下:1. 设置左边界l和右边界r,初始时l=0,r=n-1(n为数据集合的长度);2. 计算中间元素的下标mid = (l + r) / 2;3. 比较目标元素与中间元素的值,若相等,则返回目标元素的下标;4. 若目标元素小于中间元素的值,则将右边界r更新为mid-1;5. 若目标元素大于中间元素的值,则将左边界l更新为mid+1;6. 重复步骤2-5,直到找到目标元素或区间缩小为空。
折半查找的时间复杂度为O(log n),比顺序查找的时间复杂度O(n)要小得多。
3. 折半查找的实现实现折半查找的关键就是要确定好左边界l和右边界r的初始值,并在每个循环中更新这两个边界的值。
下面是使用Python语言实现折半查找的代码示例:```pythondef binary_search(arr, target):l = 0r = len(arr) - 1while l <= r:mid = (l + r) // 2if arr[mid] == target:return midelif arr[mid] < target:l = mid + 1else:r = mid - 1return -1```在上述代码中,我们通过设置左边界l和右边界r来确定待查找范围。
通过不断更新这两个边界的值,最终可以找到目标元素的位置。
如果找不到目标元素,则返回-1表示查找失败。
折半查找算法及分析(手工过程)

折半查找算法及分析(⼿⼯过程)折半查找的⼿⼯过程:1.我需要查找的数是10;给定:1 5 8 10 13 14 17 22 25 27 29 31 35 37 40 42 45 47 50 51 58下标:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 h m t h m t h m t h t m h m这个⼿⼯过程到head = tail 时找到了。
我需要查找的数是29;给定:1 5 8 10 13 14 17 22 25 27 29 31 35 37 40 42 45 47 50 51 58下标:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 h m t这个⼿⼯过程数在head < tail时程序停⽌,找到的是下标的那个数。
代码如下:#include<stdio.h>#include<stdlib.h>int binarySearch(int *arr,int count ,int data){int middle;int head = 0;int tail;tail = count;while(arr[middle] != data){middle = (head + tail)/ 2;if(arr[middle] < data){head = middle + 1;}else if(arr[middle] > data){tail = middle - 1;}}return middle;return -1;}int main(){int n = 0;int m ;int a[10]={1,4,8,9,16,17,19,20,25,27};printf("请输⼊需要查找的数: ");scanf("%d",&n);m = binarySearch(a,10,n);printf("%d ",m);return 0;}这是⼀个简单的折半处理,⽤的是⼀个简单的数组需要强调的是: 如果要运⽤折半算法,数必须是有序的(升序或者降序) 很多⼈都认为while(head > tail)这样也是正确的,但是对于middle = data时条件⼀直成⽴就会出现问题的!。
折半查找算法及程序实现教案

折半查找算法及程序实现教案教案:折半查找算法及程序实现一、教学目标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. 理解折半查找算法的基本原理。
2. 掌握折半查找算法的实现方法。
3. 分析折半查找算法的时间复杂度和空间复杂度。
4. 比较折半查找算法与顺序查找算法的性能差异。
二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 开发工具:PyCharm三、实验原理折半查找算法,又称二分查找算法,是一种在有序数组中查找特定元素的算法。
其基本原理是将待查找的元素与数组的中间元素进行比较,若相等,则查找成功;若小于中间元素,则在数组的左半部分继续查找;若大于中间元素,则在数组的右半部分继续查找。
重复此过程,直到找到目标元素或查找失败。
折半查找算法的时间复杂度为O(log2n),空间复杂度为O(1)。
四、实验步骤1. 创建一个有序数组。
2. 实现折半查找算法。
3. 比较折半查找算法与顺序查找算法的性能差异。
五、实验代码```pythondef binary_search(arr, target):left, right = 0, len(arr) - 1while left <= right:mid = (left + right) // 2if arr[mid] == target:return midelif arr[mid] < target:left = mid + 1else:right = mid - 1return -1def sequential_search(arr, target):for i in range(len(arr)):if arr[i] == target:return ireturn -1# 创建有序数组arr = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]# 查找目标元素target = 7# 折半查找index_binary = binary_search(arr, target)# 顺序查找index_sequential = sequential_search(arr, target) # 比较性能import timestart_time = time.time()binary_search(arr, target)end_time = time.time()binary_time = end_time - start_timestart_time = time.time()sequential_search(arr, target)end_time = time.time()sequential_time = end_time - start_timeprint(f"折半查找结果:索引 {index_binary}")print(f"顺序查找结果:索引 {index_sequential}")print(f"折半查找耗时:{binary_time} 秒")print(f"顺序查找耗时:{sequential_time} 秒")```六、实验结果与分析1. 折半查找结果:索引 32. 顺序查找结果:索引 33. 折半查找耗时:0.0002 秒4. 顺序查找耗时:0.0005 秒实验结果表明,折半查找算法在查找相同目标元素时,耗时明显低于顺序查找算法。
《折半查找算法》的教学设计及反思

《折半查找算法》的教学设计及反思.江苏省白蒲高级中学刘兴圣226511授课题目:折半查找算法适应范围:高一年级所属科目:教科版高中信息技术选修模块——算法与程序设计模块授课章节:第三章第3节《在数组中查找数据》教学设计(一)教学目标知识与技能:让学生理解折半查找法的基本思想,并能够编写程序代码。
过程与方法:带领学生一同分析问题、体会理解算法设计思想,先掌握编写关键性语句,再到完整程序的书写,并最终通过分析代码进一步加深理解折半查找算法的设计思想。
让学生从中逐渐学会解决问题的基本方法。
情感态度与价值观:在分析折半查找算法的过程中,引导学生积极思考和分析问题,培养学生严谨的思维习惯。
通过各组讨论、实践活动,养成良好的与人协作交流能力。
(二)教材分析教学重点:以图示法方式,演示折半查找算法的基本思想。
教学难点:由折半查找算法的思想到程序代码编写的转换,尤其是其中关键性语句的编写是教学中的难点。
(三)学情分析学习对象是高一学生,本节知识内容是在学习了数组的相关知识和顺序查找算法之后进行的,由于折半查找算法逻辑性比较强,同时学生对算法的相关概念还比较陌生,基础相对欠缺,以及学生的差异比较大,所以在教学过程中尽量要放慢讲解的速度,循序渐进的展开知识点要素,让学生能够对相关的问题进行充分思索、分析,再到问题解决。
(四)教学策略创设趣味问题情境,引导学生了解什么是折半查找算法,以图示法方式来演示折半查找算法的基本思想,并以伪代码形式描述算法中的关键性语句,最终到完整程序代码的书写。
对课题中的关键环节采用日常生活问题引入,让学生通过比较,由浅入深地引导学生思考、讨论。
通过讲授、演示观察、讨论相结合,充分调动学生的主观能动性,以达到主动式学习、探究性学习。
(五)教学方法:图示法,讲授法。
(六)教学准备:多媒体教室。
(七)课时安排:一课时教学过程一、导入(2~3分钟)上一节课我们一起学习了顺序查询法,知道它一般应用在这种情况之下:待查数据表没有顺序,且数据表的长度比较短。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二折半查找算法设计
题目:折半查找算法设计
问题描述:(1)分析掌握折半查找算法思想,在此基础上,设计出递归算法和循环结构两种实现方法的折半查找函数。
(2)编写程序实现:在保存于数组的10000个有序数据元素中查找数
据元素x是否存在。
数据元素x要包含两种情况:一种是数据元素x
包含在数组中;另一种是数据元素x不包含在数组中
(3)数组中数据元素的有序化既可以初始赋值时实现,也可以设计一
个排序函数实现。
(4)根据两种方法的实际运行时间,进行两种方法时间效率的分析对
比。
基本要求:(1)10000个数据可以初始赋值时实现,也可以调用系统的随机函数,再设计一个排序函数实现。
(2)两种方法时间效率的分析对比可以有两种方法,一种是理论分析
方法,一种是实际记录运行时间。
(3)提交实验报告。
测试数据:运行算法时,当输入的数据小于10000,例如输入9999时,显示该数据在数组中,下标为9998,并且分别显示递归和循环结构下的时
间;当输入的数据大于10000时,例如输入20000时,显示这个这个
数据不再该数组中。
算法思想:设有数组a中元素按从小到大的次序排列,a的下界下标为low,上界下标为high,首先计算出a的中间位置下标mid=(low+high)/2,
1.递归算法思想:比较x和a[mid],若x=a[mid],则查找成功;若
x<a[mid],则随后调用算法自身在下标为low,上界下标为mid-1的
区间继续查找;若x>a[mid],则随后调用算法自身在下标为mid+1,
上界下标为high的区间继续查找。
当查找区间小于等于0时,查找
过程结束。
2.循环结构思想:用while(low <= high)控制循环,比较x和a[mid],
若x=a[mid],则查找成功;若x<a[mid],则随后在下标为low,上界
下标为mid-1的区间继续查找;若x>a[mid],则随后在下标为mid+1,
上界下标为high的区间继续查找。
当查找区间小于等于0时,查找
过程结束。
模块划分:1.头文件time.h中包含time()和difftime(end,start)函数,分别实现取系统当前时间和end减去start的时间差;
2.头文件stdlib.h中包含rand()函数,实现随机数的生成;
3.void list(int a[])实现对随机数从小到大的排序;
4.int Search(int a[],int low,int high,int x)用递归算法实现折半查找数据
元素的函数;
5.int BSearch(int a[], int low, int high, int x)用循环结构实现折半查找
数据元素的函数;
6.void main()主函数,测试用递归算法和循环结构实现折半查找数据
元素的函数。
数据结构:
源程序:
#include<stdio.h>
#include<time.h>
int Bsearch(int a[],int x,int low,int high)
{
int mid;
if(low>high) return -1;
mid=(low+high)/2;
if(x==a[mid]) return mid;
else if(x<a[mid])
Bsearch(a,x,low,mid-1);
else
return Bsearch(a,x,mid+1,high);
}
int Csearch(int test[],int x,int low,int high)
{
for(int i=0;i<high;i=(low+high)/2)
{
if(x==test[i]) return i;
else if(x>test[i]) low=i+1;
else high=i-1;
}
if(i>=high) return -1;
}
void main()
{
time_t start,end;
double dif;
int Bsearch(int a[],int x,int low,int high);
int Csearch(int test[],int x,int low,int high);
int a[10000],x;
int low=0,high=10000,mid=0;
printf("请输入要查找的元素:\n");
scanf("%ld",&x);
printf("x=%ld\n",x);
for(int i=0;i<high;i++)
a[i]=i+1;
int bn;
time(&start);
bn=Bsearch(a,x,0,10000);
if(bn==-1) printf("x不在数组a中!\n");
else printf("x在数组a中,下标为%d\n",bn);
time(&end);
dif=difftime(end,start);
printf("递归折半方法耗时为:%f秒\n",dif);
int flag;
time(&start);
flag=Csearch(a,x,0,10000);
if(flag==-1) printf("x不在数组a中!\n");
else printf("x在数组a中,下标为%ld\n",flag);
time(&end);
dif=difftime(end,start);
printf("循环折半算法耗时为:%f秒\n",dif); }
测试情况:
测试结果分析:
程序运行结果和人工模拟分析过程完全相同。
说明程序设计正确。
但是因为测试程序中数组中的元素过少不能体现出两种情况即递归和循环结构两种算法
的时间差别。
理论分析知循环结构的效率高于递归结构。