折半查找算法及程序实现教案

合集下载

折半查找程序实验报告

折半查找程序实验报告

1. 理解折半查找(也称为二分查找)的原理和步骤。

2. 掌握在计算机程序中实现折半查找的方法。

3. 通过实验加深对折半查找算法的理解,并提高编程能力。

二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 开发工具:PyCharm三、实验原理折半查找是一种在有序数组中查找特定元素的算法。

其基本思想是将查找区间分为两半,然后判断目标值位于哪一半区间内,再对那一半区间进行同样的操作,直到找到目标值或查找区间为空。

折半查找的步骤如下:1. 初始化两个指针,low指向数组的第一个元素,high指向数组的最后一个元素。

2. 计算中间位置mid = (low + high) / 2。

3. 判断中间位置的元素是否为目标值:a. 如果mid位置的元素等于目标值,则查找成功。

b. 如果mid位置的元素大于目标值,则将high指针减1,继续查找左半区间。

c. 如果mid位置的元素小于目标值,则将low指针加1,继续查找右半区间。

4. 重复步骤2和3,直到找到目标值或low大于high,表示查找失败。

四、实验内容1. 编写一个折半查找的Python程序。

2. 使用该程序对不同的有序数组进行查找操作,并记录查找时间。

3. 分析折半查找算法的性能。

1. 创建一个有序数组。

2. 定义折半查找函数。

3. 调用折半查找函数,并记录查找结果和查找时间。

4. 修改数组,重复步骤3。

5. 分析实验结果。

六、实验代码```pythondef binary_search(arr, target):low = 0high = len(arr) - 1while low <= high:mid = (low + high) // 2if arr[mid] == target:return midelif arr[mid] > target:high = mid - 1else:low = mid + 1return -1# 创建有序数组arr = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]# 查找目标值target = 7# 调用折半查找函数result = binary_search(arr, target)# 输出查找结果if result != -1:print(f"元素{target}在数组中的位置为:{result}")else:print(f"元素{target}在数组中不存在")```七、实验结果与分析1. 对于不同的有序数组,折半查找函数均能正确地找到目标值或返回-1表示查找失败。

折半查找(二分查找)

折半查找(二分查找)

折半查找(⼆分查找)折半查找(⼆分查找)(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; }。

C++二分查找(折半查找)算法实例详解

C++二分查找(折半查找)算法实例详解

C++⼆分查找(折半查找)算法实例详解本⽂实例讲述了C++⼆分查找(折半查找)算法。

分享给⼤家供⼤家参考,具体如下:⼆分查找⼜称折半查找,优点是⽐较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插⼊删除困难。

因此,折半查找⽅法适⽤于不经常变动⽽查找频繁的有序列表。

⼆分查找思想⾸先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字⽐较,如果两者相等,则查找成功;否则利⽤中间位置记录将表分成前、后两个⼦表,如果中间位置记录的关键字⼤于查找关键字,则进⼀步查找前⼀⼦表,否则进⼀步查找后⼀⼦表。

重复以上过程,直到找到满⾜条件的记录,使查找成功,或直到⼦表不存在为⽌,此时查找不成功。

基本算法C语⾔实现代码:int binary_search(int arr[], int len, int elem){int low = 0;int high = len - 1;while (low <= high){int mid = (low + high) / 2;if (elem == arr[mid]){ //相等,返回midreturn mid;}else if (elem > arr[mid]){low = mid + 1; //元素⽐区间中间元素⼤,取区间中间元素的下⼀个元素作为新区间起始位置}else{high = mid - 1; //元素⽐区间中间元素⼩,取区间中间元素的上⼀个元素作为新区间结束位置}}return -1;}添加检测是否是已排好序数组的程序实例#include <iostream>using namespace std;int binary_search(int arr[], int len, int elem){int low = 0;int high = len - 1;while (low <= high){int mid = (low + high) / 2;if (elem == arr[mid]){return mid;}else if (elem > arr[mid]){low = mid + 1;}else{high = mid - 1;}}return -1;}//检测是否排好序int is_sorted(int arr[], int len){int sorted = 1;for (int i = 0; i < len - 1; i++){sorted = sorted && arr[i] <= arr[i + 1];}return sorted;}int main(){int arr[] = { 1, 3, 5, 7, 9, 11, 12, 15, 18, 23, 25, 26 }; int len = sizeof(arr) / sizeof(int);int pos;int sorted = is_sorted(arr, len);if (sorted){pos = binary_search(arr, len, 26);cout << "pos = " << pos << endl;}system("pause");}运⾏结果:pos = 11请按任意键继续. . .希望本⽂所述对⼤家C++程序设计有所帮助。

数据结构-折半查找,哈希查找

数据结构-折半查找,哈希查找

一、实验目的熟练掌握顺序查找,折半查找和哈希表等算法的程序实现。

二、实验内容1、实现折半查找的算法编写一个程序,输出在顺序表(1,2,3,4,,6,7,8,9,10)中采用折半查找方法查找关键字9的过程要求:输出查找过程中的比较对象和被查找元素的位置。

2、实现哈希表的相关运算算法编写程序实现哈希表的构造过程。

要求:建立关键字序列(16,74,60,43,54,90,46,31,29,88,77)对应的哈希表A[0...12],哈希函数为H(k)=k%p,并采用开放定址法中的线性探测法解决冲突。

输出构造完成后的哈希表。

程序源代码及运行结果(运行结果可以截图,也可以文字描述分析)1#include<stdio.h>#include<stdlib.h>int fun(int a[],int key){int high=9;int low=0;int mid=(high+low)/2;printf("与之相比较的值为:");while(high>=low){if(key==a[mid]){printf("%-2d",a[mid]);printf("\nkey为数组中第%d个元素\n",mid+1);break;}if(key<a[mid]){ printf("%-2d",a[mid]);high=mid-1;mid=(high+low)/2;}if(key>a[mid]){ printf("%-2d",a[mid]);low=mid+1;mid=(high+low)/2;}}}int main(){int a[10]={1,2,3,4,5,6,7,8,9,10};fun(a,9);system("pause");}运行截图:2#include<stdio.h>int main(){int a[11]={16,74,60,43,54,90,46,31,29,88,77};int A[13]={0};int p=11,H;for(int i=0;i<11;i++){H=a[i]%p;while(A[H]!=0){H++;if(H==12){H=0;}}A[H]=a[i];}for(int i=0;i<13;i++){if(A[i]!=0){printf("%d ",A[i]);}}}运行截图三、小结(不少于100字)感觉好像没有真正理解哈希表,折半查找比较好理解,实现起来也比较容易,自己对代码的熟练程度还不够,课后还会多多练习,查找的方式还有很多,课后应该多看书,对每种算法都有一定的了解。

折半查找算法及程序实现教案

折半查找算法及程序实现教案

折半查找算法及程序实现一、教材分析教学重点:以图示法方式,演示折半查找算法的基本思想。

教学难点:由折半查找算法的思想到程序代码编写的转换,尤其是其中关键性语句的编写是教学中的难点.二、学情分析学生应该已经掌握程序设计的基本思想,掌握赋值语句、选择语句、循环语句的基本用法和VB基本操作,这节课学生可能会遇到的最大问题是:如何归纳总结对分查找解决不同情况问题的一般规律,鉴于此,在教学中要积极引导学生采取分解动作、比较迁移等学习策略。

三、教学目标知识与技能:理解对分查找的概念和特点,通过分步解析获取对分查找的解题结构,初步掌握对分查找算法的程序实现。

过程与方法:通过分析多种不同的可能情况,逐步归纳对分查找的基本思想和方法,确定解题步骤。

情感态度与价值观:通过实践体验科学解题的重要性,增强效率意识和全局观念,感受对分查找算法的魅力,养成始终坚持、不断积累才能获得成功的意志品质。

四、教学策略与手段1、教学线索:游戏引领——-提出对分查找原理-—- 解析对分查找的算法特征---实践解决问题。

2、学习线索:分解问题—-—归纳问题———实践提升,在三个阶段的不断推进中明确对分查找算法,总结规律。

五、教学过程1、新课导入(1)热身:游戏(2分钟)找同学上来找一本上千页电话册里面的一个名字。

(课程导入我写的不是很详细,自己设计哦)(2)教师引导:所以我不希望只有他一个人体验这种方便,我们教室里还有一大帮人,其实这种什么不止用于查找电话铺,还可以运用到实际生活中,教室里有这么多人,坦白说,按学校的老方法一个人一个人的数,对所有老师来说都及其费力,那我们想想,是不是数数2368,这样好点对吗?。

不要小看这种想法,他其实是非常棒的,他能把解决问题的时间缩短一半,因此我们提出了这种算法2、新课:首先我们一起来看一看折半查询算法中的“折半"的含义.师:何为折半呢?生:减半;打一半的折扣.例如,我手里拿着一根绳子,现在我们来进行折半试验,首先拿住绳子的两个端点,然后从中点的位置进行对折,这样绳子就缩短为原来长度一半,然后将一半的绳子继续执行与刚才相同的操作,使得绳子的长度逐渐的缩短,直到绳子长度短得不能再进行折半了。

折半查找和二叉排序树

折半查找和二叉排序树

折半查找和二叉排序树一、实验目的1、掌握查找的特点。

2、掌握折半查找的基本思想及其算法。

3、熟悉二叉排序树的特点,掌握二叉排序树的插入、删除操作。

二、实验内容1、设有关键字序列k={ 5 ,14 ,18 ,21 ,23 ,29 ,31 ,35 },查找key=21和key=25的数据元素。

2、根据关键字序列{45、24、53、12、37、93}构造二叉排序树,并完成插入13删除关键字53和24的操作。

三、实验环境TC或VC++或Java四、实验步骤1、折半查找(1)从键盘输入上述8个整数5 ,14 ,18 ,21 ,23 ,29 ,31 ,35,存放在数组bub[8]中,并输出其值。

(2)从键盘输入21,查找是否存在该数据元素,若存在,则输出该数据元素在表中的位置,否则给出查找失败的信息。

(3)从键盘输入25,查找是否存在该数据元素,若存在,则输出该数据元素在表中位置,否则给出查找失败的信息。

2、二叉排序树(1)二叉排序树存储定义(2)从键盘上输入六个整数45、24、53、12、37、9构造二叉排序树(3)输出其中序遍历结果。

(4)插入数据元素13,输出其中序遍历结果。

(5)删除数据元素24和53,输出其中序遍历结果。

五、问题讨论1、折半查找递归算法该怎么描述?2、二叉排序树中序遍历结果有什么特点?3、在二叉树排序树中插入一个新结点,总是插入到叶结点下面吗?4、在任意一棵非空二叉排序树中,删除某结点后又将其插入,则所得二排序叉树与原二排序叉树相同吗?六、实验报告内容1、实验目的2、实验内容和具体要求3、完成情况和实验记录,实验记录为实验过程中遇到的问题及解决方法4、程序清单5、所输入的数据及相应的运行结果6、问题回答7、实验心得实验代码:#include<stdio.h>#include<stdlib.h>typedef struct BiTNode{int data;struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;int bub[100];void menu(){printf("********主目录*******\n");printf(" 折半或顺序查找1\n");printf(" 二叉排序树2\n");printf(" 结束程序0\n");printf("*********************\n");}void menu1(){printf("*******目录①*******\n");printf(" 输出元素1\n");printf(" 顺序查找2\n");printf(" 折半查找3\n");printf(" 结束此查找0\n");printf("********************\n");}void menu2(){printf("**********目录②*********\n");printf("输出树的中序遍历结果1\n");printf(" 插入数据元素2\n");printf(" 删除数据元素3\n");printf(" 结束二叉排序0\n");printf("*************************\n"); }void Search(){int i,m,n,key,k;printf("输入元素个数:");scanf("%d",&m);printf("依次输入元素:");for(i=1;i<=m;i++){scanf("%d",&bub[i]);}printf("输入关键字:");scanf("%d",&key);bub[0] = key;do{menu1();printf("选择查找方式:");scanf("%d",&n);switch(n){case 1:for(i=1;i<=m;i++){printf("%d,",bub[i]);}printf("\n");break;case 2:for(i=m;i>=0;i--){if(bub[i]==key){if(i!=0){printf("查找的数据元素在第%d位!\n",i);break;}else{printf("查找失败\n");}}}break;case 3:k = Search_Bin(m,key);if(k!=0)printf("查找的数据元素在第%d位!\n",k);elseprintf("查找失败\n");break;case 0:printf("查找结束\n");break;default:printf("选择错误\n");}}while(n!=0);}int Search_Bin(int m,int key){int low,high,mid;low = 1;high = m;while(low<=high){mid = (low+high)/2;if(key==bub[mid])return mid;else if(key<bub[mid])high = mid-1;elselow = mid+1;}return 0;}BiTree Insert(){BiTree T=NULL,q=NULL,p=NULL;int m;printf("输入数据(-10000停止输入):");scanf("%d",&m);while(m!=-10000){q = (BiTree)malloc(sizeof(BiTNode));q->data = m;q->lchild = q->rchild=NULL;if(!T)T = q;else{p = T;while(1){if(m<p->data){if(p->lchild==NULL){p->lchild = q;break;}p = p->lchild;}else{if(p->rchild==NULL){p->rchild = q;break;}p = p->rchild;}}}scanf("%d",&m);}return T;}void Inorder(BiTree T){if(T){Inorder(T->lchild);printf("%d,",T->data);Inorder(T->rchild);}}int Search_CH(BiTree T,int elem,BiTree f,BiTree *p) {if(!T){*p = f;return 0;}else if(elem==T->data){*p = T;return 1;}else if(elem<T->data)Search_CH(T->lchild,elem,T,p);elseSearch_CH(T->rchild,elem,T,p);}BiTree InsertBST(BiTree T,int elem){BiTree p=NULL,s=NULL;if(!Search_CH(T,elem,NULL,&p)){s = (BiTree)malloc(sizeof(BiTNode));s->data = elem;s->lchild = s->rchild = NULL;if(!p)T = s;else if(elem<p->data)p->lchild = s;elsep->rchild = s;printf("插入成功\n");return T;}printf("输入已有元素,插入失败\n");return T;}BiTree Delete(BiTree T,int elem){BiTree p=NULL,q=NULL,f=NULL,s=NULL;p = T;while(p){if(elem == p->data)break;q = p;if(elem <p->data)p = p->lchild;elsep = p->rchild;}if(!p)printf("查找失败,删除失败\n");return T;}if(!(p->lchild)){if(!q)T = p->rchild;else if(q->lchild == p)q->lchild = p->rchild;elseq->rchild = p->rchild;free(p);}else{f = p;s = p->lchild;while(s->rchild){f = s;s = s->rchild;}if(f==p)f->lchild = s->lchild;elsef->rchild = s->lchild;p->data = s->data;free(s);}printf("删除成功\n");return T;}void ErChaPaiXu(){BiTree T;int m,key;T = Insert();domenu2();printf("输入你的选择:");scanf("%d",&m);switch(m){case 1:printf("中序遍历结果为:");Inorder(T);printf("\n");break;case 2:printf("输入要插入的元素:");scanf("%d",&key);T = InsertBST(T,key);break;case 3:printf("输入要删除的元素:");scanf("%d",&key);T = Delete(T,key);break;case 0:printf("结束二叉排序\n");break;default:printf("输入错误\n");}}while(m!=0);}void main(){int m;do{menu();printf("输入你的选择:");scanf("%d",&m);switch(m){case 1:Search();break;case 2:ErChaPaiXu();break;case 0:printf("程序已结束\n");break;default:printf("输入错误\n");}}while(m!=0);}。

Python查找算法之折半查找算法的实现

Python查找算法之折半查找算法的实现

Python查找算法之折半查找算法的实现⼀、折半查找算法折半查找算法⼜称为⼆分查找算法,折半查找算法是将数据分割成两等份,⾸先⽤键值(要查找的数据)与中间值进⾏⽐较。

如果键值⼩于中间值,可确定要查找的键值在前半段;如果键值⼤于中间值,可确定要查找的键值在后半段。

然后对前半段(后半段)进⾏分割,将其分成两等份,再对⽐键值。

如此循环⽐较、分割,直到找到数据或者确定数据不存在为⽌。

折半查找的缺点是只适⽤于已经初步排序好的数列;优点是查找速度快。

⽣活中也有类似于折半查找的例⼦,例如,猜数字游戏。

在游戏开始之前,⾸先会给出⼀定的数字范围(例如0~100),并在这个范围内选择⼀个数字作为需要被猜的数字。

然后让⽤户去猜,并根据⽤户猜的数字给出提⽰(如猜⼤了或猜⼩了)。

⽤户通常的做法就是先在⼤范围内随意说⼀个数字,然后提⽰猜⼤了/猜⼩了,这样就缩⼩了猜数字的范围,慢慢地就猜到了正确的数字,如下图所⽰。

这种做法与折半查找法类似,都是通过不断缩⼩数字范围来确定数字,如果每次猜的范围值都是区间的中间值,就是折半查找算法了。

例如,已经有排序好的数列:12、45、56、66、77、80、97、101、120,要查找的数据是 101,⽤折半查找步骤如下:步骤1:将数据列出来并找到中间值 77,将 101 与 77 进⾏⽐较,如下图所⽰。

步骤2:将 101 与 77 进⾏⽐较,结果是 101 ⼤于 77,说明要查找的数据在数列的右半段。

此时不考虑左半段的数据,对在右半段的数据再进⾏分割,找中间值。

这次中间值的位置在 97 和 101之间,取 97,将 101 与 97 进⾏⽐较,如下图所⽰。

步骤3:将 101 与 97 进⾏⽐较,结果是 101 ⼤于 97,说明要查找的数据在右半段数列中,此时不考虑左半段的数据,再对剩下的数列分割,找中间值,这次中间值位置是 101,将 101 与 101进⾏⽐较,如下图所⽰。

步骤4:将 101 与 101 进⾏⽐较,所得结果相等,查找完成。

编程实现折半查找算法。

编程实现折半查找算法。

编程实现折半查找算法。

中括号内的内容为主题:编程实现折半查找算法一、介绍折半查找算法,也被称为二分查找算法,是一种高效的查找算法。

它可以在有序的数据集合中查找特定元素的位置,其时间复杂度为O(log n)。

本文将带你一步一步了解并编程实现折半查找算法。

二、算法思想1. 确定查找区间的起始和结束位置。

2. 计算区间的中间位置。

3. 如果中间位置的元素等于目标元素,则查找成功返回该位置。

4. 如果中间位置的元素大于目标元素,则在前半部分继续查找。

5. 如果中间位置的元素小于目标元素,则在后半部分继续查找。

6. 重复步骤2-5,直到找到目标元素或者区间为空。

三、代码实现下面是使用Python语言实现折半查找算法的代码:pythondef binary_search(arr, target):low = 0high = len(arr) - 1while low <= high:mid = (low + high) 2guess = arr[mid]if guess == target:return midelif guess > target:high = mid - 1else:low = mid + 1return -1代码说明:1. 函数`binary_search`接受一个有序数组`arr`和目标元素`target`作为参数。

2. 初始化变量`low`为区间左端的索引,`high`为区间右端的索引。

3. 使用`while`循环在区间内进行查找,直到找到目标元素或者区间为空。

4. 计算区间的中间位置`mid`,并将该位置的元素赋值给变量`guess`。

5. 比较`guess`和`target`的大小,如果相等,则查找成功返回`mid`。

6. 如果`guess`大于`target`,则目标元素在前半部分,将`high`更新为`mid - 1`。

7. 如果`guess`小于`target`,则目标元素在后半部分,将`low`更新为`mid + 1`。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

对分查找算法及程序实现一、设计思想对分查找是计算机科学中的一个基础算法。

对于一个基础算法的学习,同样可以让学生在一定的情境下,经历分析问题、确定算法、编程求解等用计算机解决问题的基本过程。

本堂课以一个游戏暖场,同时激活学生的思维,引导学生去探索游戏或生活背后的科学原理。

为了让学生在教师的引导下能自我解析算法的形成过程,本课分解了问题动作,找出问题的全部可能情况,在对全部可能情况总结归纳的情况下,得出对分查找的基础算法,最后在程序中得到实现,从而使学生建立起对分查找算法形成的科学逻辑结构。

二、教材分析本课的课程标准内容:(一)计算机解决问题的基本过程(1)结合实例,经历分析问题、确定算法、编程求解等用计算机解决问题的基本过程,认识算法和程序设计在其中的地位和作用。

(三)算法与问题解决例举 C 查找、排序与问题解决(2)通过实例,掌握使用数据查找算法设计程序解决问题的方法。

本课的《学科教学指导意见》内容:基本要求:1.初步掌握对分查找算法。

2.初步掌握对分查找算法的程序实现。

教材内容:第二章算法实例 2.4.3对分查找和第五章5.4查找算法的程序实现,课题定为对分查找算法及程序实现,安排两个课时,第一课时着重是对分查找算法的形成和初步程序实现,第二课时利用对分查找算法解决一些实际问题的程序实现,本教学设计为第一课时。

从《课程标准》和《学科教学指导意见》对本课教学内容的要求来看,要求学生能从问题出发,通过相应的科学步骤形成对分查找的算法。

对学生来说,要求通过这一课时的学习能初步掌握或了解对分查找的前提条件、解决问题的对象,明确对分查找算法结构和对分查找的意义。

三、学情分析学生应该已经掌握程序设计的基本思想,掌握赋值语句、选择语句、循环语句的基本用法和VB基本操作,这节课学生可能会遇到的最大问题是:如何归纳总结对分查找解决不同情况问题的一般规律,鉴于此,在教学中要积极引导学生采取分解动作、比较迁移等学习策略。

四、教学目标知识与技能:理解对分查找的概念和特点,通过分步解析获取对分查找的解题结构,初步掌握对分查找算法的程序实现。

过程与方法:通过分析多种不同的可能情况,逐步归纳对分查找的基本思想和方法,确定解题步骤。

情感态度与价值观:通过实践体验科学解题的重要性,增强效率意识和全局观念,感受对分查找算法的魅力,养成始终坚持、不断积累才能获得成功的意志品质。

五、重点难点教学重点和难点:分解并理解对分查找的过程。

六、教学策略与手段1、教学线索:游戏引领---提出对分查找原理--- 解析对分查找的算法特征---实践解决问题。

2、学习线索:分解问题---归纳问题---实践提升,在三个阶段的不断推进中明确对分查找算法,总结规律。

七、教学过程1、新课导入(1)热身:游戏(2分钟)教师展示一件特色物品,让一个学生来猜这个物品的价格,其他学生只需要根据这个学生猜出的价格提示“高了”或是“低了”,如果学生能在五次内猜对这个物品的价格,就把这件物品“赠送”给他……。

(2)讨论:你觉得怎么样猜可以猜的快一点呢?有什么技巧吗?你从这个游戏当中得到什么启示?(3分钟)(3)教师引导:这个世界不是缺少问题,而是缺少发现,其实在这个游戏的背后,含有一个非常经典的算法。

引出对分查找的的概念。

2、新课:教学步骤一:分析对分查找的原理和思想。

(3分钟)(1)对分查找是效率很高的查找方法,但被查找的数据必须是有序的。

(2)首先将查找的数与有序数组内处于中间位置的数据比较,如果中间位置上的数与查找的数不同,根据有序性,就可确定应该在数组的前半部分还是后半部分继续查找。

(3)在新确定的范围内,继续按上述方法进行查找,直到获得最终结果。

教学步骤二:分解对分查找算法(5分钟)假设:用一个数组d(1 to 10)来存放升序的元素序列,用i表示查找范围的起始位置的下标,j表示终止位置的下标,mid表示中间位置元素的下标。

(1) 第一种情况:要找的值在后半部分; 以查找键KEY=48为例分析 第一次比较:范围d(1)~d(10),mid= (1+10)\2, d(mid)<Key 所以可以确定接下来要找的范围是后半部分。

比较后i=mid+1第二次比较:范围d(6)~d(10),mid= (6+10)\2,d(mid)<Key 所以可以确定接下来要找的范围是后半部分。

比较后:i=mid+1第三次比较:范围d(9)~d(10),mid= (9+10)\2,d(mid)=Key ,找到了。

思考:如果要找的是52? i,j,mid 分别是多少?这也说明当i=j 的时候是查找的最后可能次数,这也是终止查找的一个关键条件。

教学步骤三:继续分解对分查找算法中包含的其他情况。

画一画:请仿照上面的画法,分别画出key=17和key=20的查找示意图。

(2) 第二种情况:要找的值在前半部分; 以查找键KEY=17为例分析:mijd(10) d(9) d(8) d(7) d(6) d(5) d(4) d(3) d(2) d(1)mi d ijd(10)d(9) d(8) d(7)d(6) i mi d i jd(10)d(9)d(5)d(4) d(3) d(2) d(1) imij mid(4)d(3) d(2) d(1) d(3) d(4)mi ji结果分析:第一次比较后:j=mid-1第二次比较后:i=mid+1第三次比较后:找到了 (3)第三种情况:要找的值找不到;以查找键KEY=20为例分析: 结果分析:第一次比较后:j=mid-1第二次比较后:i=mid+1第三次比较后:i=mid+1第四次比较:i=j 但是d(mid)≠key,所以找不到。

教学步骤四:对各种情况进行归纳总结。

(1)Key 与d(mid)的大小比较影响i,j 的取值的规律: i 的取值规律:if d(mid)<key then i=mid+1 j 的取值规律:if d(mid)>key then j=mid-1 用分支结构实现。

i jmid(4)d(3) d(2)d(1)ijmid d(4)i,j,midd(10d(9) d(8) d(7) d(6) d(5) d(4) d(3) d(2) d(1) ij mi(2)继续进行重复查找的条件: i≤j,用循环结构实现。

教学步骤五:构建对分查找的流程图教学步骤六:对分查找算法的初步程序实现。

教师事先设计好Vb窗体,学生只需要在相应的程序体输入代表算法思想的关键语句。

附主要程序体:Private Sub Command2_Click()Dim key As Integer, mid As Integer, i As Integer, j As Integerkey = Val(Text1.Text)i = 1: j = 10Do While i <= jmid = (i + j) \ 2If d(mid) = key ThenText2.Text = "找到了,是第" & mid & "个"Exit SubEnd IfIf d(mid) < key Theni = mid + 1Elsej = mid - 1End IfLoopText2.Text = "找不到"End Sub程序说明:1、获得要查找的数据key的值 key = Val(Text1.Text)2、i,j赋初值。

i = 1: j = 103、求mid的值。

mid = (i + j) \ 24、分三种情况,(1)如果key=d(mid),则如果 d(mid) = key 那么Text2.Text = "找到了,在第" + Str(mid) + "个"。

(2)如果key>d(mid),那么i=mid+1 否则 j=mid+15、重复上述的3,4步,直到i超出j(或者理解为i<=j不成立,所以不能用for next,而要用do while语句)6、如果有找到key,那执行第4步(1)步后应该输出找到的位置后退出程序,如果不退出,说明key没有找到,所以在相应位置要输出“找不到”。

教学步骤七:评价。

评价学生的程序实现情况,并讨论或实践问题:如果是降序序列,该怎么样改动程序?如果序列元素不是10个,而是100个或更多呢?教学步骤八:总结提升。

(1)由于对分查找过程中的每次比较都能使得搜索空间减半,对分查找将不会使用超过log2n次比较来找到目标值。

(2)提升对分查找算法的实际意义:同学们可能还没有意识到二分查找是多么高效,那不妨设想一下在一个包含一百万个人名的电话簿中找一个名字,二分查找可以让你不超过21次就能找到指定的名字。

如果你能够将世界上所有的人按照姓名排序,那么你可以在35步以内找到任何人。

八、作业:1、以下的三组元素序列能采用对分查找法来查找吗?(1) 19,33,35,53,56,67,78,99(2)53,35,67,78,56,99,33,19(3)99,67,56,45,33,10,9,1,0,-92、设计一个能用对分查找算法思想解决的实际问题。

【参考资料】网络文章类/。

相关文档
最新文档