实验十二 实现顺序和二分查找算法
实验十二实现顺序和二分查找算法姓名:张就班级:09计算机一班学号:2009111111 一、实验目的
掌握顺序和二分查找算法的基本思想及其实现方法。
二、实验内容
对给定的任意数组(设其长度为n),分别用顺序和二分查找方法在此数组中查找与给定值k相等的元素。
三、算法思想与算法描述
1、顺序查找,在顺序表R[0..n-1]中查找关键字为k的记录,成功时返回找到的记录位置,失败时返回-1,具体的算法如下所示:
int SeqSearch(SeqList R,int n,KeyType k)
{
int i=0;
while(i { printf("%d",R[i].key); i++; } if(i>=n) return -1; else { printf("%d",R[i].key); return i; } } 2、二分查找,在有序表R[0..n-1]中进行二分查找,成功时返回记录的位置,失败时返回-1,具体的算法如下: int BinSearch(SeqList R,int n,KeyType k) { int low=0,high=n-1,mid,count=0; while(low<=high) { mid=(low+high)/2; printf("第%d次查找:在[ %d ,%d]中找到元素R[%d]:%d\n ",++count,low,high,mid,R[mid].key); if(R[mid].key==k) return mid; if(R[mid].key>k) high=mid-1; else low=mid+1; } return -1; } 四、实验步骤与算法实现 #include #define MAXL 100 typedef int KeyType; typedef char InforType[10]; typedef struct { KeyType key; InforType data; }NodeType; typedef NodeType SeqList[MAXL]; int SeqSearch(SeqList R,int n,KeyType k) { int i=0; while(i { printf("%d",R[i].key); i++; } if(i>=n) return -1; else { printf("%d",R[i].key); return i; } } int BinSearch(SeqList R,int n,KeyType k) { int low=0,high=n-1,mid,count=0; while(low<=high) { mid=(low+high)/2; printf("第%d次查找:在[ %d ,%d]中找到元素R[%d]:%d\n ",++count,low,high,mid,R[mid].key); if(R[mid].key==k) return mid; if(R[mid].key>k) high=mid-1; else low=mid+1; } return -1; } int BinSearch1(SeqList R,KeyType k, int low,int high) { int mid; if(low>high) return -1; mid=(low+high)/2; if(k==R[mid].key) return mid; else if(k return BinSearch1(R,k,low,mid-1); else return BinSearch1(R,k,mid+1,high); } void main(){ SeqList R; int n=10; KeyType k=7; int a[]={1,5,3,4,2,6,7,11,9,10},i; for(i=0;i R[i].key=a[i]; printf("\n"); if((i=SeqSearch(R,n,k))!=-1) printf("\n元素%d的位置是%d\n",k,i); else printf("\n元素%d的位置不在表中\n",k); printf("\n"); if((i=BinSearch(R,n,k))!=-1) printf("\n元素%d的位置是%d\n",k,i); else printf("\n元素%d的位置不在表中\n",k); printf("\n"); if((i=BinSearch1(R,k,0,7))!=-1) printf("\n元素%d的位置是%d\n",k,i); else printf("\n元素%d的位置不在表中\n",k); printf("\n"); } 五、实验测试及结果 程序完全正确的执行结果,如图所示: 六、总结与体会 通过这次在实现顺序和二分查找算法的过程中,让我对顺序和二分查找算法有了更多的了解。查找根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素或(记录)的操作,应用十分广泛。顺序查找是一种最简单的查找方法。它的基本思路是:从表的一端开始,顺序扫描线性表,依次将扫描到的关键字和给定值k相比较,若当前扫描到的关键字与k相等,则查找成功;若扫描结束后,仍未找到关键字等于k的记录,则查找失败。二分查找也称为折半查找要求 线性表中的结点必须己按关键字值的递增或递减顺序排列。它首先用要查找的关键字k与中间位置的结点的关键字相比较,这个中间结点把线性表分成了两个子表,若比较结果相等则查找完成;若不相等,再根据k与该中间结点关键字的比较大小确定下一步查找哪个子表,这样递归进行下去,直到找到满足条件的结点或者该线性表中没有这样的结点。在学习过程中,善于发现,会找到更多的捷径。 有序顺序表的二分查找的递归算法。 #include int data; l.elem=(ElemType *)malloc(l.length*sizeof( ElemType)); if(!l.elem)exit(overflow); cout<<"请输入顺序表的长度: "; cin>>len; l.length=len; cout<<"请输入顺序表的数据:"< C语言顺序查找、折半查找#include voidcreat_LIST(linkqueue *LIST) { char x; linkqueue *p,*s; s=LIST; while((x=getchar())!='#') { p=(linkqueue *)malloc(sizeof(linkqueue)); p->data=x; p->next=NULL; s->next=p; s=p; } printf("您创建的列表是:"); print_LIST(LIST); } voidshunxu(linkqueue *LIST) { int i=0,k=1; printf("输入您要查找的元素:"); getchar(); temp=getchar(); linkqueue *p; p=LIST->next; for(;p!=NULL;p=p->next) { i++; if(p->data==temp) {printf("####顺序查找####\n您要查找的元素在第%d位,比较了%d次\n",i,i); k=0;break;} } if(k) printf("####顺序查找####\n您要查找的元素不存在。\n"); } voidzheban(linkqueue *LIST) { intlen=len_LIST(LIST); linkqueue *s; s=LIST->next; int a[100]; for(int i=0;i 陕西科技大学实验报告 班级学号姓名实验组别 实验日期室温报告日期成绩 报告内容:(目的和要求、原理、步骤、数据、计算、小结等) 实验名称:查找与排序算法的实现和应用 实验目的: 1. 掌握顺序表中查找的实现及监视哨的作用。 2. 掌握折半查找所需的条件、折半查找的过程和实现方法。 3. 掌握二叉排序树的创建过程,掌握二叉排序树查找过程的实现。 4. 掌握哈希表的基本概念,熟悉哈希函数的选择方法,掌握使用线性探测法和链地址法进行冲突解决的方 法。 5. 掌握直接插入排序、希尔排序、快速排序算法的实现。 实验环境(硬/软件要求):Windows 2000,Visual C++ 6.0 实验内容: 通过具体算法程序,进一步加深对各种查找算法的掌握,以及对实际应用中问题解决方 法的掌握。各查找算法的输入序列为:26 5 37 1 61 11 59 15 48 19输出 要求:查找关键字37,给出查找结果。对于给定的某无序序列,分别用直接插入排序、希尔排序、快速排序等方法进行排序,并输出每种排序下的各趟排序结果。 各排序算法输入的无序序列为:26 5 37 1 61 11 59 15 48 19。 实验要求: 一、查找法 1. 顺序查找 首先从键盘输入一个数据序列生成一个顺序表,然后从键盘上任意输入一个值,在顺序 表中进行查找。 2. 折半查找 任意输入一组数据作为个数据元素的键值,首先将此序列进行排序,然后再改有序表上 使用折半查找算法进对给定值key 的查找。 3. 二叉树查找 任意输入一组数据作为二叉排序树中节点的键值,首先创建一颗二叉排序树,然后再次二叉排序树上实现对一 定k的查找过程。 4. 哈希表查找 任意输入一组数值作为个元素的键值,哈希函数为Hash (key )=key%11, 用线性探测再散列法解决冲突问题。 二、排序算法 编程实现直接插入排序、希尔排序、快速排序各算法函数;并编写主函数对各排序函数进行测试。 实验原理: 1. 顺序查找: 在一个已知无(或有序)序队列中找出与给定关键字相同的数的具体位置。原理是让关键字与队列中的数从最后一个开始逐个比较,直到找出与给定关键字相同的数为止,它的缺点是效率低下。 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以 一判断题 1.顺序查找法适用于存储结构为顺序或链接存储的线行表。 2.一个广义表可以为其他广义表所共享。 3.快速排序是选择排序的算法。 4.完全二叉树的某结点若无左子树,则它必是叶子结点。 5.最小代价生成树是唯一的。 6.哈希表的结点中只包含数据元素自身的信息,不包含任何指针。 7.存放在磁盘,磁带上的文件,即可意识顺序文件,也可以是索引文件。8.折半查找法的查找速度一定比顺序查找法快。 二选择题 1.将两个各有n个元素的有序表归并成一个有序表,其最少的比较次数是()。 A. n B. 2n-1 C. 2n D. n-1 2.在文件"局部有序"或文件长度较小的情况下,最佳内部排序的方法是()。 A. 直接插入排序 B.气泡排序 C. 简单选择排序 D. 快速排序 3.高度为K的二叉树最的结点数为()。 A. 2 4.一个栈的输入序列是12345,则占的不可能的输出序列是() A.54321 B. 45321 C.43512 D.12345 5.ISAM文件和V ASM文件属于() A索引非顺序文件 B. 索引顺序文件 C. 顺序文件 D. 散列文件 6. 任何一棵二叉树的叶子结点在先序,中序和后序遍历序列中的相对次序() A. 不发生变化 B. 发生变化 C. 不能确定 D. 以上都不对 7.已知某二叉树的后序遍历序列是dabec, 中序遍历序列是debac , 它的前序遍历是()。 A. acbed B. decab C. deabc D.cedba 三.填空题 1.将下图二叉树按中序线索化,结点的右指针指向(),Y的左指针指向() B D C X E Y 2.一棵树T中,包括一个度为1的结点,两个度为2的结点,三个度为3的结点,四各度为4的结点和若干叶子结点,则T的叶结点数为() 实验报告 课程名称数据结构实验名称查找与排序的实现 系别专业班级指导教师11 学号姓名实验日期实验成绩 一、实验目的 (1)掌握交换排序算法(冒泡排序)的基本思想; (2)掌握交换排序算法(冒泡排序)的实现方法; (3)掌握折半查找算法的基本思想; (4)掌握折半查找算法的实现方法; 二、实验内容 1.对同一组数据分别进行冒泡排序,输出排序结果。要求: 1)设计三种输入数据序列:正序、反序、无序 2)修改程序: a)将序列采用手工输入的方式输入 b)增加记录比较次数、移动次数的变量并输出其值,分析三种序列状态的算法时间复杂 性 2.对给定的有序查找集合,通过折半查找与给定值k相等的元素。 3.在冒泡算法中若设置一个变量lastExchangeIndex来标记每趟排序时经过交换的最后位置, 算法如何改进? 三、设计与编码 1.本实验用到的理论知识 2.算法设计 3.编码 package sort_search; import java.util.Scanner; public class Sort_Search { //冒泡排序算法 public void BubbleSort(int r[]){ int temp; int count=0,move=0; boolean flag=true; for(int i=1;i 算法设计与分析各种查找算法的性能测试 目录 摘要 (3) 第一章:简介(Introduction) (4) 1.1 算法背景 (4) 第二章:算法定义(Algorithm Specification) (4) 2.1 数据结构 (4) 2.2顺序查找法的伪代码 (5) 2.3 二分查找(递归)法的伪代码 (5) 2.4 二分查找(非递归)法的伪代码 (6) 第三章:测试结果(Testing Results) (8) 3.1 测试案例表 (8) 3.2 散点图 (9) 第四章:分析和讨论 (11) 4.1 顺序查找 (11) 4.1.1 基本原理 (11) 4.2.2 时间复杂度分析 (11) 4.2.3优缺点 (11) 4.2.4该进的方法 (12) 4.2 二分查找(递归与非递归) (12) 4.2.1 基本原理 (12) 4.2.2 时间复杂度分析 (13) 4.2.3优缺点 (13) 4.2.4 改进的方法 (13) 附录:源代码(基于C语言的) (15) 声明 ................................................................................................................ 错误!未定义书签。 摘要 在计算机许多应用领域中,查找操作都是十分重要的研究技术。查找效率的好坏直接影响应用软件的性能,而查找算法又分静态查找和动态查找。 我们设置待查找表的元素为整数,用不同的测试数据做测试比较,长度取固定的三种,对象由随机数生成,无需人工干预来选择或者输入数据。比较的指标为关键字的查找次数。经过比较可以看到,当规模不断增加时,各种算法之间的差别是很大的。这三种查找方法中,顺序查找是一次从序列开始从头到尾逐个检查,是最简单的查找方法,但比较次数最多,虽说二分查找的效率比顺序查找高,但二分查找只适用于有序表,且限于顺序存储结构。 关键字:顺序查找、二分查找(递归与非递归) 01:查找特定的值 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 在一个序列(下标从1开始)中查找一个给定的值,输出第一次出现的位置。 输入 第一行包含一个正整数n,表示序列中元素个数。1 <= n <= 10000。 第二行包含n个整数,依次给出序列的每个元素,相邻两个整数之间用单个空格隔开。元素的绝对值不超过10000。 第三行包含一个整数x,为需要查找的特定值。x的绝对值不超过10000。 输出 若序列中存在x,输出x第一次出现的下标;否则输出-1。 5 2 3 6 7 3 3 2 02:输出最高分数的学生姓名 查看 描述 输入学生的人数,然后再输入每位学生的分数和姓名,求获得最高分数的学生的姓名。 输入 第一行输入一个正整数N(N <= 100),表示学生人数。接着输入N行,每行格式如下: 分数姓名 分数是一个非负整数,且小于等于100; 姓名为一个连续的字符串,中间没有空格,长度不超过20。 数据保证最高分只有一位同学。 输出 获得最高分数同学的姓名。 5 87 lilei 99 hanmeimei 97 lily 96 lucy 77 jim hanmeimei 来源 习题(13-1) 03:不高兴的津津 查看 描述 津津上初中了。妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班。另外每周妈妈还会送她去学习朗诵、舞蹈和钢琴。但是津津如果一天上课超过八个小时就会不高兴,而且上得越久就会越不高兴。假设津津不会因为其它事不高兴,并且她的不高兴不会持续到第二天。 请你帮忙检查一下津津下周的日程安排,看看下周她会不会不高兴;如果会的话,哪天最不高兴。 输入 包括七行数据,分别表示周一到周日的日程安排。每行包括两个小于10的非负整数,用空格隔开,分别表示津津在学校上课的时间和妈妈安排她上课的时间。 输出 包括一行,这一行只包含一个数字。如果不会不高兴则输出0,如果会则输出最不高兴的是周几(用1, 2, 3, 4, 5, 6, 7分别表示周一,周二,周三,周四,周五,周六,周日)。如果有两天或两天以上不高兴的程度相当,则输出时间最靠前的一天。 5 3 6 2 7 2 5 3 5 4 0 4 0 6 3 一、实验目的 1、掌握顺序查找和二分查找方法的基本思想及其实现技术 2、了解顺序查找和二分查找方法的优缺点和适用范围 二、实验内容(任务、要求或步骤等) 【问题描述】实现在有n个元素的顺序表上的顺序查找和二分查找。 【基本要求】 (1)编写一个创建函数,建立并输出一个有n个元素的顺序表,数据元素为整型。顺序表长度和顺序表的各数据元素由键盘输入。 (2)编写函数实现在有n个元素的顺序表上的顺序查找。 (3)编写函数实现在有n个元素的递增有序的顺序表上的二分查找。 (4)提供菜单,供用户选择要执行的操作,根据用户选择调用相应函数实现顺序查找和二分查找 三:源程序 二分查找如下 #include s.elem[0] = key; // “哨兵” for (i=s.length; s.elem[i]!=key; --i); return i; // 找不到时,i为0 } void main () {ssTable s; int x, pos; CreatssTable(s); cout<<"请输入要查找的值"; cin>>x; pos=SeqSearch(s,x); if(pos>0)cout< 二分查找算法是在有序数组中用到的较为频繁的一种算法,在未接触二分查找算法时,最通用的一种做法是,对数组进行遍历,跟每个元素进行比较,其时间为O(n).但二分查找算法则更优,因为其查找时间为O(lgn),譬如数组{1,2,3,4,5,6,7,8,9},查找元素6,用二分查找的算法执行的话,其顺序为: 1.第一步查找中间元素,即5,由于5<6,则6必然在5之后的数组元素中,那么就在{6,7,8,9}中查找, 2.寻找{6,7,8,9}的中位数,为7,7>6,则6应该在7左边的数组元素中,那么只剩下6,即找到了。 二分查找算法就是不断将数组进行对半分割,每次拿中间元素和goal进行比较。 #include if(index != -1) cout< 项目名称:各种查找算法的性能测试 项目成员: 组编号: 完成时间: 目录 前言 (2) 正文 (2) 第一章简介 (2) 1.1顺序查找问题描述 (2) 1.2二分查找问题描述 (2) 第二章算法定义 (2) 2.1顺序查找算法定义 (2) 2.2二分查找算法定义 (3) 第三章测试结果(Testing Results) (5) 3.1 实验结果表 (5) 3.2 散点图记录 (5) 第四章分析和讨论 (6) 4.1顺序查找分析 (6) 4.2二分查找分析 (6) 附录:源代码(基于C语言的) (7) 声明 (13) 前言 查找问题就是在给定的集合(或者是多重集,它允许多个元素具有相同的值)中找寻一个给定的值,我们称之为查找键。 对于查找问题来说,没有一种算法在任何情况下是都是最优的。有些算法速度比其他算法快,但是需要较多的存储空间;有些算法速度非常快,但仅适用于有序数组。查找问题没有稳定性的问题,但会发生其他的问题(动态查找表)。 在数据结构课程中,我们已经学过了几种查找算法,比较有代表性的有顺序查找(蛮力查找),二分查找(采用分治技术),哈希查找(理论上来讲是最好的查找方法)。 第一章:简介(Introduction) 1.1顺序查找问题描述: 顺序查找从表中最后一个记录开始,逐个进行记录的关键字和给定值的比较,若某个记录的关键字和给定值比较相等,则查找成功,找到所查记录;反之,若直至第一个记录,其关键字和给定值比较都不等,则表明表中没有所查记录,查找不成功。 1.2二分查找问题描述: (1)分析掌握折半查找算法思想,在此基础上,设计出递归算法和循环结构两种实现方法的折半查找函数。 (2)编写程序实现:在保存于数组a[i]有序数据元素中查找数据元素k是否存在。数元素k要包含两种情况:一种是数据元素k包含在数组中;另一种是数据元素k不包含在数组中 (3)数组中数据元素的有序化既可以初始赋值时实现,也可以设计一个排序函数实现。(4)根据两种方法的实际运行时间,进行两种方法时间效率的分析对比。 第二章:算法定义(Algorithm Specification) 2.1顺序查找 从表的一端向另一端逐个进行记录的关键字和给定值(要查找的元素)的比较,若某个记录的关键字和给定值比较相等,则查找成功,找到所查找记录;反之,若直至第一个记录,其关键 《数据结构》实验 题目:顺序查找班级:08计科 学号:10号姓名: #include { int j; list[num].key=searchnum; for(j=0;list[j].key!=searchnum;j++) ; return j 实验十二实现顺序和二分查找算法[管理资料] 实验十二实现顺序和二分查找算法姓名:张就班级:09计算机一班学 号:2009111111 一、实验目的 掌握顺序和二分查找算法的基本思想及其实现方法。 二、实验内容 对给定的任意数组(设其长度为n),分别用顺序和二分查找方法在此数组中查找与给定值k相等的元素。三、算法思想与算法描述 1、顺序查找,在顺序表R[0..n-1]中查找关键字为k的记录,成功时返回找到的记录位置,失败时返回-1,具体的算法如下所示: int SeqSearch(SeqList R,int n,KeyType k) { int i=0; while(i return i; } } 2、二分查找,在有序表R[0..n-1]中进行二分查找,成功时返回记录 的位置,失败时返回-1,具体的算法如下: int BinSearch(SeqList R,int n,KeyType k) { int low=0,high=n-1,mid,count=0; while(low<=high) { mid=(low+high)/2; printf("第%d次查找:在[ %d ,%d]中找到元素R[%d]:%d\n ",++count,low,high,mid,R[mid].key); if(R[mid].key==k) return mid; if(R[mid].key>k) high=mid-1; else low=mid+1; } return -1; } 四、实验步骤与算法实现 #include 顺序表查找 周次:第4周 一、实验目的 1、掌握线性表中元素的前驱、后续的概念。 2、掌握顺序表与链表的建立、插入元素、删除表中某元素的算法。 3、掌握线性表三种查找的算法。 4、对线性表相应算法的时间复杂度进行分析。 5、理解顺序表数据结构的特点(优缺点)。 二、实验环境 ⒈硬件:每个学生需配备计算机一台。 ⒉软件:Windows操作系统和VC++6; 三、实验要求 1.将实验中所要求的每个功能用一个函数实现。 2.每个输入前要有输入提示,每个输出数据都要求有内容说明(如:280和100的和是:380。)。 3.函数名称和变量名称等用英文或英文简写(每个单词第一个字母大写)形式说明。 四、实验内容 1.在自己的U盘中建立“姓名+学号”文件夹,并在该文件夹中创建“实验1”文件夹(以后每次实验分别创建对应的文件夹),本次实验的所有程序和数据都要求存储到本文件夹中(以后实验都按照本次要求)。 2.阅读参考下面程序,补充完善程序并运行程序,写出结果: (1)补充实现在顺序表中的删除功能函数,并在主函数中补充代码验证算法的正确性。(2)补充实现在顺序表中的查找功能函数,并在主函数中补充代码验证算法的正确性。(注意:查找功能实现顺序查找和二分查找) 3.阅读参考书上程序,实现在顺序表中的删除功能和查找功能函数,并写出结果。 (注意:2和3只要完成其中之一即可,完成后可以截图后发我qq邮箱。) #include "stdafx.h" #include 实验五 查找及排序 实验课程名: 数据结构与算法 一、实验目的及要求 1、掌握查找的不同方法,并能用高级语言实现查找算法。 2、熟练掌握顺序表的查找方法和有序顺序表的折半查找算法。 3、掌握常用的排序方法,并能用高级语言实现排序算法。 4、深刻理解排序的定义和各种排序方法的特点,并能加以灵活运用。 5、了解各种方法的排序过程及依据的原则,并掌握各种排序方法的时间复杂度的分析方法。 二、实验内容 任务一:顺序表的顺序查找。 有序表的折半查找。 完成下列程序,该程序实现高考成绩表(如下表所示)的顺序查找,在输出结果中显示查找成功与查找不成功信息。 解答: (1)源代码:#include 顺序查找 #include #include 上机实验报告 实验课题:实现对有序数据集合的顺序查找和二分查找,并展示出查找过程 设计思路: 我们可以采用数组有序的保存所有数据,这样便于将数据的有序性和其索引的有序性统一起来,同时也便于查找数据。需要声明的是,我们不使用零下标的项,这样做是为了在顺序查找中优化传统顺序查找算法,具体原因后面会有详细介绍。为此,我们可以设计一个类,私有变量声明为该数组和数组的长度。由于集合中的数据类型未知,所以该类为模板类。 对于公有成员,我们创建六个成员函数,除了构造函数和析构函数,其他四个函数分别用来获取外界传入的数组长度、获取外界传入的数组数据、对数据实现顺序查找、对数据实现二分查找。 这里,我们只重点介绍顺序查找函数和二分查找函数。 对于顺序查找,我们对传统的顺序查找方法进行优化,避开每次对数据索引是否越界进行判断这一步骤。具体做法是:将所查找的元素保存在零下标的项中(这也是零下标闲置的原因),然后按照下标顺序从后向前依次遍历匹配所查找元 素与数组元素。若两者相等,展示出该数组元素,并将其下标值反馈给客户;若两者不相等,展示出该元素,进行下一轮匹配。若最终标记下标达到零下标处,说明未查找到所要查找的元素,则客户反馈该信息。 优化后的顺序查找算法比传统的顺序查找算法减少一半的步骤,原因在于每次无须判断标记下标是否越界,这是该算法优化后的优点。它的缺点是没有利用到数据集合有序这一性质,且查找效率低。 对于二分查找,我们声明三个整型变量low、high和mid 依次标记查找域的上界下标、下界下标和中值下标,其中mid=(low+high)/2。我们在开始的时候将low初始化为1(上文中提到过,我们是从下表为1的位置开始存储数据),将high初始化为len(数组长度),并由此初始化mid的值。对于任意一次查找,将索引为mid的值与所查找的值进行比较。若两者相等,则将该元素的索引值反馈给客户;若所查找的值比索引为mid的值小,则将high的值变为mid-1,进行下一轮的查找;若所查找的值比索引为mid的值大,则将low 的值变为mid+1,进行下一轮查找。若最终low>high,则表明未查找到所要查找的值,将此信息反馈给客户。 该算法是一种效率很高的算法,因为它充分利用到数据集合的有序性,这一优点在数据规模较大时体现的更明显。 折半查找算法及程序实现 一、教材分析 教学重点:以图示法方式,演示折半查找算法的基本思想。 教学难点:由折半查找算法的思想到程序代码编写的转换,尤其是其中关键性语句的编写是教学中的难点。 二、学情分析 学生应该已经掌握程序设计的基本思想,掌握赋值语句、选择语句、循环语句的基本用法和VB基本操作,这节课学生可能会遇到的最大问题是:如何归纳总结对分查找解决不同情况问题的一般规律,鉴于此,在教学中要积极引导学生采取分解动作、比较迁移等学习策略。 三、教学目标 知识与技能:理解对分查找的概念和特点,通过分步解析获取对分查找的解题结构,初步掌握对分查找算法的程序实现。 过程与方法:通过分析多种不同的可能情况,逐步归纳对分查找的基本思想和方法,确定解题步骤。 情感态度与价值观:通过实践体验科学解题的重要性,增强效率意识和全局观念,感受对分查找算法的魅力,养成始终坚持、不断积累才能获得成功的意志品质。 四、教学策略与手段 1、教学线索:游戏引领---提出对分查找原理--- 解析对分查找的算法特征---实践解决问题。 2、学习线索:分解问题---归纳问题---实践提升,在三个阶段的不断推进中明确对分查找算法,总结规律。 五、教学过程 1、新课导入 (1)热身:游戏(2分钟) 找同学上来找一本上千页电话册里面的一个名字。(课程导入我写的不是很详细,自己设计哦) (2)教师引导:所以我不希望只有他一个人体验这种方便,我们教室里还有一大帮人,其实这种什么不止用于查找电话铺,还可以运用到实际生活中,教室里有这么多人,坦白说,按学校的老方法一个人一个人的数,对所有老师来说都及其费力,那我们想想,是不是数数2368,这样好点对吗?。不要小看这种想法,他其实是非常棒的,他能把解决问题的时间缩短一半,因此我们提出了这种算法 2、新课: 首先我们一起来看一看折半查询算法中的“折半”的含义。 师:何为折半呢? 生:减半;打一半的折扣。 例如,我手里拿着一根绳子,现在我们来进行折半试验,首先拿住绳子的两个端点, 然后从中点的位置进行对折,这样绳子就缩短为原来长度一半,然后将一半的绳子继续执行与刚才相同的操作,使得绳子的长度逐渐的缩短,直到绳子长度短得不能再进行折半了。 师:那什么时候就不能再折半了呢? 生:即绳子的两个端点合二为一为止。 折半查找算法的思想与绳子折半的过程基本相同。下面我们先通过图示来看看折半查找算法究竟是什么? 教学步骤二:分解对分查找算法(5分钟)有序顺序表的二分查找的递归算法
C语言 顺序查找和折半查找
实验8查找与排序算法的实现和应用
顺序查找法适用于存储结构为顺序或链接存储的线行表
数据结构实验五-查找与排序的实现
各种查找算法的性能比较测试(顺序查找、二分查找)
编程基础之顺序查找
C++源程序顺序查找与二分查找
二分法查找算法
各种查找算法性能分析
顺序查找
实验十二 实现顺序和二分查找算法[管理资料]
顺序表查找
实验五查找及排序讲解
顺序查找
二分查找和顺序查找
折半查找算法及程序实现教案