《C语言程序设计与数据结构》-刘信杰-电子教案 C语言程序设计与数据结构 课件第15章

上传人:E**** 文档编号:89407735 上传时间:2019-05-24 格式:PPT 页数:33 大小:1.33MB
返回 下载 相关 举报
《C语言程序设计与数据结构》-刘信杰-电子教案  C语言程序设计与数据结构 课件第15章_第1页
第1页 / 共33页
《C语言程序设计与数据结构》-刘信杰-电子教案  C语言程序设计与数据结构 课件第15章_第2页
第2页 / 共33页
《C语言程序设计与数据结构》-刘信杰-电子教案  C语言程序设计与数据结构 课件第15章_第3页
第3页 / 共33页
《C语言程序设计与数据结构》-刘信杰-电子教案  C语言程序设计与数据结构 课件第15章_第4页
第4页 / 共33页
《C语言程序设计与数据结构》-刘信杰-电子教案  C语言程序设计与数据结构 课件第15章_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《《C语言程序设计与数据结构》-刘信杰-电子教案 C语言程序设计与数据结构 课件第15章》由会员分享,可在线阅读,更多相关《《C语言程序设计与数据结构》-刘信杰-电子教案 C语言程序设计与数据结构 课件第15章(33页珍藏版)》请在金锄头文库上搜索。

1、C语言程序设计与数据结构,第15章 查找与排序,C语言程序设计与数据结构,总体要求: 掌握查找与排序的基本概念; 掌握顺序查找和二分查找的算法; 掌握直接插入排序、简单选择排序、冒泡排序的算法; 学习重点: 查找的有关算法:顺序查找、折半查找; 常用的排序方法:插入排序、交换排序。,C语言程序设计与数据结构,主要内容,15.1 基本概念 15.2 查找算法介绍 15.3 排序算法介绍 15.4 典型习题分析解答,C语言程序设计与数据结构,15.1基本概念,15.1.1 查找的基本概念 查找表(Search Table) 是由同一类型的数据元素(或记录)构成的集合。 若对查找表只作前两种统称为“

2、查找”的操作,则称此类查找表为静态查找表(Static Search Table)。若在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已存在的某个数据元素,则称此类表为动态查找表(Dynamic Search Table)。本章集中讨论静态查找表。 所谓“查找”即为在一个含有众多的数据元素(或记录)的查找表中找出某个“特定的”数据元素(或记录)。 关键字(Key) 是数据元素(或记录)中某个数据项的值,用它可以标识(识别)一个数据元素(或记录)。若此关键字可以唯一地标识一个记录,则称此关键字为主关键字(Primary Key)(对不同的记录,其主关键字均不同)。反之,称用以识别

3、若干记录的关键字为次关键字(Secondary Key)。当数据元素只有一个数据项时,其关键字即为该数据元素的值。 查找(Searching) 根据给定的某个值,在查找表中确定一个其关键字等于给定值的记录或数据元素。若表中存在这样的一个记录,则称查找是成功的,查找的结果为给出整个记录的信息,或指示该记录在查找表中的位置;若表中不存在关键字等于给定值的记录,则称查找不成功,此时查找的结果可给出一个“空”记录或“空”指针。,C语言程序设计与数据结构,15.1.2 排序的基本概念,排序(Sorting)是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个按关

4、键字有序的序列。 假设含n个记录的序列为 R1,R2,Rn ,若在排序后的序列中 Ri仍领先于Rj,则称所用的排序方法是稳定的;反之,若可能使排序后的序列中Rj领先于Ri,则称所用的排序方法是不稳定的。 由于待排序的记录数量不同,使得排序过程中涉及的存储器不同,可将排序方法分为两大类:一类是内部排序,指的是待排序记录存放在计算机随机存储器中进行的排序过程;另一类是外部排序,指的是待排序记录的数量很大,以致内存一次不能容纳全部记录,在排序过程中尚需对外存进行访问的排序过程。,C语言程序设计与数据结构,15.2 查找算法介绍,15.2.1 顺序查找 顺序查找(Sequential Search)的

5、查找过程为: 从表中最后一个记录开始,逐个进行记录的关键字和给定值的比较,若某个记录的关键字和给定值比较相等,则查找成功,找到所查记录;反之,若直至第一个记录,其关键字和给定值比较都不等,则表明表中没有所查记录,查找不成功。此查找过程可用下列算法描述。 【算法15.1】顺序查找的算法: int Search_Seq(Sqlist ST,KeyType key) /在顺序表ST中顺序查找其关键字等于key的数据元素。 /若找到,则函数值为该元素在表中的位置,否则为0。 ST.r0.key = key; /0号单元作为监视哨 for( i=ST.length; !EQ (ST.ri.key , k

6、ey); -i ); /从后往前找 return i; /找不到时,i为0 / End of Search_Seq 查找操作的性能分析:,C语言程序设计与数据结构,15.2.2 折半查找,折半查找(BinarySearch)的查找过程是:先确定待查记录所在的范围(区间),然后逐步缩小范围直到找到或找不到该记录为止。(具体查找过程见第7章) 算法如下: /在有序表ST中折半查找其关键字等于key的数据元素。若找到,则函数值为该元素在表中的位置,否则为0。 【算法15.2】折半查找的算法: int binsrch(Sqlist L, int key) int mid,low,high,find;

7、low=1; high=L.length;find=0; /*置区间初值*/ while (lowL.rmid.key ) low=mid+1; /*在后半区间查找*/ else high=mid-1; /*在前半区间查找*/ if (find) return (mid); /*查找成功,返回找到元素的位置*/ else return (0); /*查找不成功,返回0标记*/ /Search_Bin,C语言程序设计与数据结构,折半查找的平均查找长度是: ASL=log2(n+1)-1 可见,折半查找的效率比顺序查找高,但折半查找只能适用于有序表,且限于顺序存储结构(对线性链表无法进行折半查找)

8、。以有序表表示静态查找表时,进行查找的方法除折半查找之外,还有斐波那契查找和插值查找。,C语言程序设计与数据结构,15.2.3分块查找,分块查找又称索引顺序查找,这是顺序查找的一种改进方法 。 在处理线性表时,如果既希望能够快速查找,又要经常动态变化,则可以采用分块查找方法。分块查找又称索引顺序查找,要求将待查的元素均匀的分成块,块间按大小排序,块内不排序。因此需要建立一个块的最大(或最小)关键字表,称之为“索引表”。 具体而言,假设我们按结点元素关键字升序方式组织表中各块,则要求第一块中任一结点的关键字值都小于第二块中所有结点的关键字值;第二块中任一结点的关键字值都小于第三块中所有结点的关键

9、字值;如此类推。然后选择每块中的最大(或最小)关键字值组成索引表。换言之,索引表中的结点个数等于线性表被分割的块数。,C语言程序设计与数据结构,例如要找关键字为k的元素,则先用折半查找法由索引表查出k所在的块,再用顺序查找法在对应的块中找出k。在图8-2中若要找关键字值为41的元素,则先由索引表查出41在第二块中(294164),再在第二块中找到41。 由此我们可以总结:分块查找分两步进行,第一步确定要查找结点在表中的哪一块,第二步在确定的块中找到该结点。 分块查找的平均查找长度为: ASL=ASLb+ASLe 其中ASLb是折半查找的平均查找长度,ASLe是用顺序查找法查块内元素的平均查找长

10、度。设每块中有s个元素,可以近似的得到: 可以看出分块查找的平均查找长度位于顺序查找和折半查找之间。 下面我们简单的对以上几种查找方法做出比较: (1)平均查找长度:折半查找最小,分块查找次之,顺序查找最大; (2)表的结构:顺序查找对有序表、无序表均适用;折半查找仅适用于有序表;分块查找要求表中元素是逐段有序的,就是块与块之间的记录按关键字有序; (3)存储结构:顺序查找和分块查找对向量和线性链表结构均适用;折半查找只适用于向量存储结构的表,因而要求表中元素基本不变,而在需要插入或删除运算时,要移动元素,才能保持表的有序性,所以影响了查找效率。,C语言程序设计与数据结构,15.3 排序算法介

11、绍,15.3.1插入排序 15.3.1.1直接插入排序 直接插人排序(Straight Insertion Sort)是一种最简单的排序方法,它的基本操作是将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增1的有序表。(具体过程见第七章 数组) 【算法15.3】 直接插入排序的算法: void insertSort (Sqlist / 插入到正确位置 /insertsort,C语言程序设计与数据结构,直接插入排序的算法简洁,容易实现,那么它的效率如何呢? 首先从空间角度来看,它只需要一个辅助空间r0。 从时间耗费角度来看,主要时间耗费在关键词比较和移动元素上。 对于一趟插入排序,算

12、法中的while循环的次数主要取决于待插记录与前i-1个记录的关键词的关系上。 最好情况为(顺序) ri.key ri-1.key,while循环只执行1次,且不移动记录; 最坏情况为(逆序) ri.key r1.key,则while循环中关键词比较次数和移动记录的次数为i-1。 对整个排序过程而言,最好情况是待排序记录本身已按关键词有序排列,此时总的比较次数为n-1次,移动记录的次数也达到最小值2(n-1)(每一次只对待插记录ri移动两次);最坏情况是待排序记录按关键词逆序排列,此时总的比较次数达到最大值为,即,记录移动的次数也达到最大值,即。算法执行的时间耗费主要取决于资料的分布情况。若待

13、排序记录是随机的,即待排序记录可能出现的各种排列的概率相同,则可以取上述最小值和最大值的平均值,约为。因此,直接插入排序的时间复杂度为T(n)=O(n2),空间复杂度为S(n)=O(1)。,C语言程序设计与数据结构,15.3.1.2 希尔排序,基本思想:先将整个待排序记录序列分割成若干子序列分别进行直接插入排序,待整个序列“基本有序”时,再对全体记录进行一次直接插入排序。排序过程: 先将整个待排序记录以d1为步长分成若干子序列,把所有相隔为d1的记录放在同一组内; 在每个分组内进行直接插入排序; 在将整个待排序记录序列以d2(d2d1n)为步长重新分组和在每组内进行直接插入排序; 重复上步,直

14、至dt=1,即所有记录放进一个组中进行直接插入排序。 另外,对间隔数d的取法也很多,通常的取法可以是 (i=2,3,4,) 式中,n为序列中元素的总个数。,C语言程序设计与数据结构,【算法15.4】希尔排序的算法: void ShellInsert(Sqlist for(k=0;kt;k+) ShellSort(L,dltak); /*一趟增量为dltak的插入排序*/ ,C语言程序设计与数据结构,为什么希尔排序的时间性能优于直接插入排序呢?直接插入排序在文件初态为正序时所需要时间最少,实际上,当文件初态基本有序时直接插入排序所需的比较和移动次数均较少。另一面,当n值较小时,n和n2的差别也较

15、小,即直接插入排序的最好时间复杂度O(n)和最坏时间复杂度O(n2)差别不大。在希尔排序时增量较大,分组较多,每组的记录数目少,故各组内直接插入较快,后来增量di逐渐缩小,分组数逐渐减少,而各组的记录数目逐渐增多,但由于已经按di-1作为距离排过序,使文件较近于有序状态,所以新的一趟排序过程也较快。因此,希尔排序在效率上较直接插入排序有较大的改进。希尔排序是不稳定的。,C语言程序设计与数据结构,15.3.2选择排序,15.3.2.1 直接选择排序 基本思想:直接选择排序是一种简单的排序方法,它的基本步骤是: 把顺序存储的 n 个待排序的记录看成由一个有序区和一个无序区组成。初始时,有序区为空,

16、无序区为 (R1,R2,Rn); 在一趟选择排序中,从无序区选出一个关键字最小的记录,把它放到有序区的表尾; 经过 n-1 趟选择和插入后,n个记录变为递增有序。 第1遍扫描时,在n个记录中为了选出最小关键字的记录,需要进行n-1次比较,第2扫描时,在余下的n-1记录中,再选出具有最小关键字的记录需要比较n-2次,第n-1扫描时,在最后的2个记录中,比较1次选出最小关键字的记录.,C语言程序设计与数据结构,【算法15.5】 直接选择排序的算法: void selectsort(Sqlist /End of SelectSort,C语言程序设计与数据结构,时间复杂度: 记录移动次数:最好情况:0, 最坏情况:3(n-1); 比较次数:直接选择排序的关键字比较次数与对象的初始排列无关。第 i 趟选择具有最小关键字对象所需的比较次数总是 n-i次;因此,总的关键字比较次数为: 空间复

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号