收藏 分享(赏)

成绩排名与查询.ppt

上传人:无敌 文档编号:318622 上传时间:2018-03-28 格式:PPT 页数:48 大小:310.50KB
下载 相关 举报
成绩排名与查询.ppt_第1页
第1页 / 共48页
成绩排名与查询.ppt_第2页
第2页 / 共48页
成绩排名与查询.ppt_第3页
第3页 / 共48页
成绩排名与查询.ppt_第4页
第4页 / 共48页
成绩排名与查询.ppt_第5页
第5页 / 共48页
点击查看更多>>
资源描述

1、2,教学目标1、知识目标1)了解排序的基本概念;2)了解查找的基本概念;3)掌握基本的排序算法;4)掌握基本的查询算法;5)掌握分析不同排序算法的优劣的方法6)掌握分析不同查询算法的优劣的方法2、能力目标1)具有选择恰当的排序算法解决实际问题的能力 ;2)具有选择恰当的查询算法解决实际问题的能力。3、素质目标养成善于思考解决实际问题的良好习惯。,一、任务描述,排名与查询是我们在日常生活中经常碰到的一类任务,成绩排名与查询也是学校中不可或缺的一项重要工作,选择恰当的排序与查询算法是提高工作效率的一个重要途径。要完成这项任务,首先要选择一个合适的排序与查询算法,因此,选择什么样的排序与查询算法等一

2、系列的问题就成为了我们完成这项任务的关键。为此,我们先来学习下面的相关知识。,3,二、相关知识1、查找的基本概念查找表 用于查找的数据元素集合称为查找表。查找表由同一类型的数据元素(或记录)构成。静态查找表 若只对查找表进行如下两种操作:(1)在查找表中查看某个特定的数据元素是否在查找表中,(2)检索某个特定元素的各种属性,则称这类查找表为静态查找表。静态查找表在查找过程中查找表本身不发生变化。对静态查找表进行的查找操作称为静态查找。动态查找表 若在查找过程中可以将查找表中不存在的数据元素插入,或者从查找表中删除某个数据元素,则称这类查找表为动态查找表。动态查找表在查找过程中查找表可能会发生变

3、化。对动态查找表进行的查找操作称为动态查找。,4,关键字 是数据元素中的某个数据项。唯一能标识数据元素(或记录)的关键字,即每个元素的关键字值互不相同,我们称这种关键字为主关键字;若查找表中某些元素的关键字值相同,称这种关键字为次关键字。例如,银行帐户中的帐号是主关键字,而姓名是次关键字。 查找 在数据元素集合中查找满足某种条件的数据元素的过程称为查找。最简单且最常用的查找条件是“关键字值等于某个给定值”,在查找表搜索关键字等于给定值的数据元素(或记录)。若表中存在这样的记录,则称查找成功,此时的查找结果应给出找到记录的全部信息或指示找到记录的存储位置;若表中不存在关键字等于给定值的记录,则称

4、查找不成功,此时查找的结果可以给出一个空记录或空指针。若按主关键字查找,查找结果是唯一的;若按次关键字查找,结果可能是多个记录,即结果可能不唯一。,5,查找表的存储结构 查找表是一种非常灵活的数据结构,对于不同的存储结构,其查找方法不同。为了提高查找速度,有时会采用一些特殊的存储结构。本章将介绍以线性结构、树型结构及哈希表结构为存储结构的各种查找算法。查找算法的时间效率 查找过程的主要操作是关键字的比较,所以通常以“平均比较次数”来衡量查找算法的时间效率。,6,2顺序查找2.1 顺序查找的基本思想顺序查找是一种最简单的查找方法。其基本思想是将查找表作为一个线性表,可以是顺序表,也可以是链表,依

5、次用查找条件中给定的值与查找表中数据元素的关键字值进行比较,若某个记录的关键字值与给定值相等,则查找成功,返回该记录的存储位置,反之,若直到最后一个记录,其关键字值与给定值均不相等,则查找失败,返回查找失败标志。2.2 顺序表的顺序查找下面是顺序表的类型定义:#define MAX_NUM 100 /用于定义表的长度typedef struct elemtype keytype key; anytype otheritem; Se_ListMAX_NUM,Se_Item;,7,假设在查找表中,数据元素个数为n(nMAX_NUM),并分别存放在数组的下标变量a1an中。下面我们给出顺序查找的完整

6、算法。int seq_search (Se_List a,keytype k)/在顺序表中查找关键字值等于k的记录, /若查找成功,返回该记录的位置下标序号,否则返回0 i=1; while (inext; while (p!=NULL) 顺序查找算法简单,对表的结构无任何要求;但是执行效率较低,尤其当n较大时,不宜采用这种查找方法。,10,3折半查找3.1 折半查找的基本思想折半查找要求查找表用顺序存储结构存放且各数据元素按关键字有序(升序或隆序)排列,也就是说折半查找只适用于对有序顺序表进行查找。折半查找的基本思想是:首先以整个查找表作为查找范围,用查找条件中给定值k与中间位置结点的关键字

7、比较,若相等,则查找成功,否则,根据比较结果缩小查找范围,如果k的值小于关键字的值,根据查找表的有序性可知查找的数据元素只有可能在表的前半部分,即在左半部分子表中,所以继续对左子表进行折半查找;若k的值大于中间结点的关键字值,则可以判定查找的数据元素只有可能在表的后半部分,即在右半部分子表中,所以应该继续对右子表进行折半查找。每进行一次折半查找,要么查找成功,结束查找,要么将查找范围缩小一半,如此重复,直到查找成功或查找范围缩小为空即查找失败为止。,11,3.2 折半查找算法假设查找表存放在数组a的a1an中,且升序,查找关键字值为k。折半查找的主要步骤为:(1)置初始查找范围:low=1,h

8、igh=n;(2)求查找范围中间项:mid=(low+high)/2(3)将指定的关键字值k与中间项amid.key比较若相等,查找成功,找到的数据元素为此时mid 指向的位置;若小于,查找范围的低端数据元素指针low不变,高端数据元素指针high更新为mid-1;若大于,查找范围的高端数据元素指针high不变,低端数据元素指针low更新为mid+1;(4)重复步骤(2)、(3)直到查找成功或查找范围空(lowhigh),即查找失败为止。(5)如果查找成功,返回找到元素的存放位置,即当前的中间项位置指针mid;否则返回查找失败标志。,12,折半查找的完整算法如下:int bin_search

9、(Se_List a, keytype k) low=1; high=n; /置初始查找范围的低、高端指针 while (low=high) mid=(low+high)/2; /计算中间项位置 if (k=amid.key) break; /找到,结束循环 else if (k amid.key) high=mid-1;/给定值k小 else low=mid+1; /给定值k大 if (low key = k )return bt; else if (k key) return bt_search ( bt - lchild , k ); /在左子树中搜索 else return bt_se

10、arch ( bt - rchild , k ); /在右子树中搜索 这个过程也可以用非递归算法实现,算法描述如下:Bin_Sort_Tree_Node *bt_search1(Bin_Sort_Tree bt , keytype k) p = bt; /指针p指向根结点,搜索从根结点开始 while ( p != NULL ,16,6.排序6.1排序的基本概念关键字 是数据元素中的某个数据项。如果某个数据项可以唯一地确定一个数据元素,就将其称为主关键字;否则,称为次关键字。排序 是把一组无序地数据元素按照关键字值递增(或递减)地重新排列。如果排序依据的是主关键字,排序的结果将是唯一的,排序算

11、法的稳定性 如果在待排序的记录序列中有多个数据元素的关键字值相同,经过排序后,这些数据元素的相对次序保持不变,则称这种排序算法是稳定的,否则称之为不稳定的。内部排序与外部排序 根据在排序过程中待排序的所有数据元素是否全部被放置在内存中,可将排序方法分为内部排序和外部排序两大类。内部排序是指在排序的整个过程中,待排序的所有数据元素全部被放置在内存中;外部排序是指由于待排序的数据元素个数太多,不能同时放置在内存,而需要将一部分数据元素放置在内存,另一部分数据元素放置在外设上,整个排序过程需要在内外存之间多次交换数据才能得到排序的结果。本任务只讨论常用的内部排序方法。,17,排序的基本方法 内部排序

12、主要有5种方法:插入、交换、选择、归并和基数。趟 在排序过程中,基本动作执行一次。排序算法的效率 评价排序算法的效率主要有两点:一是在数据量规模一定的条件下,算法执行所消耗的平均时间,对于排序操作,时间主要消耗在关键字之间的比较和数据元素的移动上,因此我们可以认为高效率的排序算法应该是尽可能少的比较次数和尽可能少的数据元素移动次数;二是执行算法所需要的辅助存储空间,辅助存储空间是指在数据量规模一定的条件下,除了存放待排序数据元素占用的存储空间之外,执行算法所需要的其他存储空间,理想的空间效率是算法执行期间所需要的辅助空间与待排序的数据量无关。待排序记录序列的存储结构 待排序记录序列可以用顺序存

13、储结构和和链式存储结构表示。,18,我们将待排序的记录序列用顺序存储结构表示,即用一维数组实现。其定义如下所示:#define MAX_NUM 80/待排序记录序列中的最大数据元素个数typedef struct elemtype /待排序的数据元素类型 keytype key;/数据元素的关键字 anytype otheritem;/数据元素中的其他成份DataTypeMAX_NUM+1;,19,7.插入排序插入排序的主要思路是不断地将待排序的数值插入到有序段中,使有序段逐渐扩大,直至所有数值都进入有序段中位置。7.1直接插入排序7.1.1 直接插入排序的基本思想 直接插入排序是一种比较简单

14、的排序方法。它的基本思想是依次将记录序列中的每一个记录插入到有序段中,使有序段的长度不断地扩大。其具体的排序过程可以描述如下:首先将待排序记录序列中的第一个记录作为一个有序段,将记录序列中的第二个记录插入到上述有序段中形成由两个记录组成的有序段,再将记录序列中的第三个记录插入到这个有序段中,形成由三个记录组成的有序段,依此类推,每一趟都是将一个记录插入到前面的有序段中,假设当前欲处理第i个记录,则应该将这个记录插入到由前i-1个记录组成的有序段中,从而形成一个由i个记录组成的按关键字值排列的有序序列,直到所有记录都插入到有序段中。一共需要经过n-1趟就可以将初始序列的n个记录重新排列成按关键字

15、值大小排列的有序序列。,20,7.1.2 直接插入排序算法将第i个记录插入到由前面i-1个记录构成的有序段中主要有两个步骤: 将待插入记录ai 保存在a0中,即a0=ai; 搜索插入位置:j=i-1; /j最初指示i的前一个位置while (a0.key aj.key) aj+1=aj; /后移关键字值大于a0.key的记录 j=j-1; /将j指向前一个记录,为下次比较做准备aj+1=a0; /将a0放置在第j+1个位置上完整的插入排序算法为:void insertsort (DataType a, int n) for (i=2; i=n; i+) /需要n-1趟 a0=ai; /将ai赋

16、予监视哨j=i-1;while (a0.keyaj.key) /搜索插入位置 aj+1=aj; j=j-1; aj+1=a0;/ 将原ai中的记录放入第j+1个位置,21,7.2希尔排序7.2.1 希尔排序的基本思想希尔排序方法又称为缩小增量排序,其基本思想是将待排序的记录划分成几组,从而减少参与直接插入排序的数据量,当经过几次分组排序后,记录的排列已经基本有序,这个时候再对所有的记录实施直接插入排序。具体步骤可以描述如下:假设待排序的记录为n个,先取整数daj+1),则将其交换,最终达到有序化。其处理过程为:(1)将整个待排序的记录序列划分成有序区和无序区,初始状态有序区为空,无序区包括所有

17、待排序的记录。(2)对无序区从前向后依次将相邻记录的关键字进行比较,若逆序将其交换,从而使得关键字值小的记录向上“飘浮”(左移),关键字值大的记录好像石块,向下“堕落”(右移)。每经过一趟冒泡排序,都使无序区中关键字值最大的记录进入有序区,对于由n个记录组成的记录序列,最多经过n-1趟冒泡排序,就可以将这n个记录重新按关键字顺序排列,24,8.1.2 冒泡排序算法原始的冒泡排序算法对由n个记录组成的记录序列,最多经过(n-1)趟冒泡排序,就可以使记录序列成为有序序列,第一趟定位第n个记录,此时有序区只有一个记录;第二趟定位第n-1个记录,此时有序区有两个记录;以此类推,算法框架为:for(i=

18、n;i1;i-) 定位第i个记录;若定位第i个记录,需要从前向后对无序区中的相邻记录进行关键字的比较,它可以用如下所示的语句实现。for(j=1;ja.j+1.key) temp=aj;aj=aj+1;aj+1=temp; ,25,下面给出完成的冒泡排序算法:void BubbleSort1 (DataType a,int n) for (i=n;i1;i-) for (j=1;ja.j+1.key) temp=aj;aj=aj+1;aj+1=temp; ,26,8.2. 快速排序 8.2.1 快速排序的基本思想快速排序又称为分区交换排序。其基本思想是:首先将待排序记录序列中的所有记录作为当前

19、待排序区域,从中任选取一个记录(比如,第一个记录),并以该记录的关键字值为基准,从位于待排序记录序列左右两端开始,逐渐向中间靠拢,交替与基准记录的关键字进行比较、交换,每次比较,若遇左侧记录的关键字值大于基准记录的关键字,则将其与基准记录交换,使其移到基准记录的右侧,若遇右侧记录的关键字值小于基准值,则将其与基准记录交换,使其移至基准记录的左侧,最后让基准记录到达它的最终位置,此时,基准记录将待排序记录分成了左右两个区域,位于基准记录左侧的记录都小于或等于基准记录的关键字,位于基准记录右侧的所有记录的关键字都大于或等于基准记录的关键字,这就是一趟快速排序;然后分别对左右两个新的待排序区域,重复

20、上述一趟快速排序的过程,其结果分别让左右两个区域中的基准记录都到达它们的最终位置,同时将待排序记录序列分成更小的待排序区域,再次重复对每个区域进行一趟快束排序,直到每个区域只有一个记录为止,此时所有的记录都到达了它的最终位置,即整个待排序记录按关键值有序排列,至此排序结束。,27,对待排序记录序列进行一趟快速排序的过程描述如下:(1) 初始化:取第一个记录作为基准,其关键字值为19,设置两个指针i,j分别用来指示将要与基准记录进行比较的左侧记录位置和右侧记录位置。最开始从右侧开始比较,当发生交换操作后,转去再从左侧比较;(2) 用基准记录与右侧记录进行比较:即与指针j指向的记录进行比较,如果右

21、侧记录的关键字值大,则继续与右侧前一个记录进行比较,即j减1后,再用基准元素与j指向的记录比较,若右侧的记录小(逆序),则将基准记录与j指向的记录进行交换;(3) 用基准元素与左侧记录进行比较:即与指针i指向的记录进行比较,如果左侧记录的关键字值小,则继续与左侧后一个记录进行比较,即i加1后,再用基准记录与i指向的记录比较,若左侧的记录大(逆序),则将基准记录与i指向的记录交换,;(4) 右侧比较与左侧比较交替重复进行,直到指针i与j指向同一位置,即指向基准记录最终的位置。,28,8.2.2 快速排序算法快速排序是一个递归的过程,只要能够实现一趟快速排序的算法,就可以利用递归的方法对一趟快速排

22、序后的左右分区域分别进行快速排序。下面是一趟快速排序的算法分析:(1) 初始化:将i 和j分别指向待排序区域的最左侧记录和最右侧记录的位置。i=first; j=end;将基准记录暂存在temp中。temp=ai;(2) 对当前待排序区域从右侧将要进行比较的记录(j指向的记录)开始向左侧进行扫描,直到找到第一个关键字值小于基准记录关键字值的记录:while (ij ,29,下面是快速排序的完整算法。void quicksort (DataType a,int first,int end ) i=first; j=end; temp=ai; /初始化 while(ij) while (ij &

23、temp.key= aj.key) j-; ai=aj; while (ij & ai.key=temp.key) i+; aj=ai; ai=temp; if (firsti-1) quicksort(a, first, i-1); /对左侧分区域进行快速排序 if (i+1end) quicksort(a, i+1, end); /对右侧分区域进行快速排序,30,9.选择排序选择排序是指在排序过程序中,依次从待排序的记录序列中选择出关键字值最小的记录、关键字值次小的记录、,并分别将它们定位到序列左侧的第1个位置、第二个位置、,最后剩下一个关键字值最大的记录位于序列的最后一个位置,从而使待排

24、序的记录序列成为按关键字值由小到大排列的的有序序列。9.1. 简单选择排序9.1.1 简单选择排序的基本思想简单选择排序的基本思想是:每一趟在n-i+1(i=1,2,3,.,n-1)个记录中选取关键字最小的记录作为有序序列中的第i个记录。它的具体实现过程为:(1) 将整个记录序列划分为有序区域和无序区域,有序区域位于最左端,无序区域位于右端,初始状态有序区域为空,无序区域含有待排序的所有n个记录。(2) 设置一个整型变量index,用于记录在一趟的比较过程中,当前关键字值最小的记录位置。开始将它设定为当前无序区域的第一个位置,即假设这个位置的关键字最小,然后用它与无序区域中其他记录进行比较,若

25、发现有比它的关键字还小的记录,就将index改为这个新的最小记录位置,随后再用aindex.key 与后面的记录进行比较,并根据比较结果,随时修改index的值,一趟结束后index中保留的就是本趟选择的关键字最小的记录位置。(3) 将index位置的记录交换到无序区域的第一个位置,使得有序区域扩展了一个记录,而无序区域减少了一个记录。不断重复 (2)、(3),直到无序区域剩下一个记录为止。此时所有的记录已经按关键字从小到大的顺序排列就位。,31,9.1.2 简单选择排序算法简单选择排序的整体结构应该为:for (i=1;in;i) 第i趟简单选择排序;下面我们进一步分析一下“第i 趟简单选择

26、排序”的算法实现。(1)初始化:假设无序区域中的第一个记录为关键字值最小的元素,即将index=i; (2)搜索无序区域中关键字值最小的记录位置:for (j=i+1;j =n;j+)if (aj.keya.index.ke) index=j;(3)将无序区域中关键字最小的记录与无序区域的第一个记录进行交换,使得有序区域由原来的i-1个记录扩展到i个记录。,32,完整算法:void selecsort ( DataType a, int n) for( i=1; in; i+) /对n个记录进行n-1趟的简单选择排序 index=i; /初始化第i趟简单选择排序的最小记录指针 for (j=i

27、+1;j=n;j+) /搜索关键字最小的记录位置 if (aj.keyaj.key) break; else ai=aj; i=j; j=2*i; ,36,堆排序的筛选算法:void sift (DataType a,int k,int m) i=k;;j=2*i;temp=ai; while (j aj .key) break; else ai=aj ;i=j;j=2*i; ai = temp;堆排序完整的算法。void heapsort (DataType a, int n) h=n/2 ; /最后一个非终端结点的编号 for ( i=h ; i=1; i-) /初建堆。从最后一个非终端结

28、点至根结点 sift ( a, i, n ) ; for ( i=n ; i1 ; i- ) /重复执行移走堆顶结点及重建堆的操作 temp=a1 ; a1=ai; ai=temp ; sift ( a , 1 , i-1 ); ,37,三、任务分析,成绩的排名和查找可以分成两部分来处理,一部分进行成绩的排名,另外一部分进行成绩的查询。成绩排名在此部分可以使用冒泡排序、直接插入排序、直接选择排序、快速排序、希尔排序、堆排序进行分析比较,我们可以通过此任务直接观察各种排序算法的效率,分析优劣,选择出最合适的 一种排序算法。成绩查询在此部分可以使用顺序查找、二分法、二叉排序树等查询算法进行查询,我

29、们通过此任务直接观察各种查找算法的效率,分析优劣,选择出最合适的一种排序算法。,38,四、任务分解,为完成成绩的排名和查询需要进行下面的任务:任务10.1 使用冒泡算法对成绩排序其处理过程为:(1)将整个待排序的记录序列划分成有序区和无序区,初始状态有序区为空,无序区包括所有待排序的记录。(2)对无序区从前向后依次将相邻记录的关键字进行比较,若逆序将其交换,从而使得关键字值小的记录向上“飘浮”(左移),关键字值大的记录好像石块,向下“堕落”(右移)。,39,任务10.2 使用直接插入排序算法对成绩排序首先将待排序记录序列中的第一个记录作为一个有序段,将记录序列中的第二个记录插入到上述有序段中形

30、成由两个记录组成的有序段,再将记录序列中的第三个记录插入到这个有序段中,形成由三个记录组成的有序段,依此类推,每一趟都是将一个记录插入到前面的有序段中,假设当前欲处理第i个记录,则应该将这个记录插入到由前i-1个记录组成的有序段中,从而形成一个由i个记录组成的按关键字值排列的有序序列,直到所有记录都插入到有序段中。一共需要经过n-1趟就可以将初始序列的n个记录重新排列成按关键字值大小排列的有序序列。,40,任务10.3 使用直接选择排序算法对成绩排序每一趟在n-i+1(i=1,2,3,.,n-1)个记录中选取关键字最小的记录作为有序序列中的第i个记录。它的具体实现过程为:(1) 将整个记录序列

31、划分为有序区域和无序区域,有序区域位于最左端,无序区域位于右端,初始状态有序区域为空,无序区域含有待排序的所有n个记录。(2) 设置一个整型变量index,用于记录在一趟的比较过程中,当前关键字值最小的记录位置。开始将它设定为当前无序区域的第一个位置,即假设这个位置的关键字最小,然后用它与无序区域中其他记录进行比较,若发现有比它的关键字还小的记录,就将index改为这个新的最小记录位置,随后再用aindex.key 与后面的记录进行比较,并根据比较结果,随时修改index的值,一趟结束后index中保留的就是本趟选择的关键字最小的记录位置。(3) 将index位置的记录交换到无序区域的第一个位

32、置,使得有序区域扩展了一个记录,而无序区域减少了一个记录。不断重复 (2)、(3),直到无序区域剩下一个记录为止。此时所有的记录已经按关键字从小到大的顺序排列就位。,41,任务10.4 使用快速排序算法对成绩排序首先将待排序记录序列中的所有记录作为当前待排序区域,从中任选取一个记录(比如,第一个记录),并以该记录的关键字值为基准,从位于待排序记录序列左右两端开始,逐渐向中间靠拢,交替与基准记录的关键字进行比较、交换,每次比较,若遇左侧记录的关键字值大于基准记录的关键字,则将其与基准记录交换,使其移到基准记录的右侧,若遇右侧记录的关键字值小于基准值,则将其与基准记录交换,使其移至基准记录的左侧,

33、最后让基准记录到达它的最终位置,此时,基准记录将待排序记录分成了左右两个区域,位于基准记录左侧的记录都小于或等于基准记录的关键字,位于基准记录右侧的所有记录的关键字都大于或等于基准记录的关键字,这就是一趟快速排序;然后分别对左右两个新的待排序区域,重复上述一趟快速排序的过程,其结果分别让左右两个区域中的基准记录都到达它们的最终位置,同时将待排序记录序列分成更小的待排序区域,再次重复对每个区域进行一趟快束排序,直到每个区域只有一个记录为止,此时所有的记录都到达了它的最终位置,即整个待排序记录按关键值有序排列,至此排序结束。,42,任务10.5 使用希尔排序算法对成绩排序假设待排序的记录为n个,先

34、取整数dn,例如,取d= n/2 ( n/2 表示不大于n/2的最大整数),将所有距离为d的记录构成一组,从而将整个待排序记录序列分割成为d个子序列,如图8-2所示,对每个分组分别进行直接插入排序,然后再缩小间隔d,例如,取d= d/2 ,重复上述的分组,再对每个分组分别进行直接插入排序,直到最后取d=1,即将所有记录放在一组进行一次直接插入排序,最终将所有记录重新排列成按关键字有序的序列。任务10.6 使用堆排序算法对成绩排序从堆的定义可以看出,若将堆用一棵完全二叉树表示,则根结点是当前堆中所有结点的最小者(或最大者)。堆排序的基本思想是:首先将待排序的记录序列构造一个堆,此时,选出了堆中所

35、有记录的最小者或最大者,然后将它从堆中移走,并将剩余的记录再调整成堆,这样又找出了次小(或次大)的记录,以此类推,直到堆中只有一个记录为止,每个记录出堆的顺序就是一个有序序列。,43,任务10.7 对上述排序算法进行分析比较分析上述排序算法的比较次数和元素移动次数,在每次调用不同的排序算法时,记录每种排序算法的移动次数和比较次数,最后输出。任务10.8 使用顺序查找算法对成绩进行查找可以是顺序表,也可以是链表,依次用查找条件中给定的值与查找表中数据元素的关键字值进行比较,若某个记录的关键字值与给定值相等,则查找成功,返回该记录的存储位置,反之,若直到最后一个记录,其关键字值与给定值均不相等,则

36、查找失败,返回查找失败标志。任务10.9 使用二分查找算法对成绩进行查找首先以整个查找表作为查找范围,用查找条件中给定值k与中间位置结点的关键字比较,若相等,则查找成功,否则,根据比较结果缩小查找范围,如果k的值小于关键字的值,根据查找表的有序性可知查找的数据元素只有可能在表的前半部分,即在左半部分子表中,所以继续对左子表进行折半查找;若k的值大于中间结点的关键字值,则可以判定查找的数据元素只有可能在表的后半部分,即在右半部分子表中,所以应该继续对右子表进行折半查找。每进行一次折半查找,要么查找成功,结束查找,要么将查找范围缩小一半,如此重复,直到查找成功或查找范围缩小为空即查找失败为止。,4

37、4,任务10.10 使用二叉排序树算法对成绩进行查找一棵非空二叉排序树中根结点的关键字值大于其左子树上所有结点的关键字值,而小于其右子树上所有结点的关键字值,所以在二叉排序树中查找一个关键字值为k 的结点的基本思想是:用给定值k与根结点关键字值比较,如果k小于根结点的值,则要找的结点只可能在左子树中,所以继续在左子树中查找,否则将继续在右子树中查找,依此方法,查找下去,至直查找成功或查找失败为止。二叉排序树查找的过程描述如下:(1)若二叉树为空树,则查找失败,(2)将给定值k 与根结点的关键字值比较,若相等,则查找成功,(3)若根结点的关键字值小于给定值k,则在左子树中继续搜索,(4)否则,在右子树中继续查找。任务10.11 分析上述不同查找算法的效率在调用不同查找算法的时候记录每种查找算法的查找次数,最后输出查找次数,以此为依据判断不同查找算法的优劣。此任务在任务10.8、任务10.9、任务10.10中分别实现。下面给出各任务和主函数的算法。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报