第八章 排序3955495-课件(PPT-精).ppt

  1. 1、本文档共91页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第八章 排序3955495-课件(PPT-精)

8.1 基本概念 8.2 插入排序 8.3 交换排序 8.4 选择排序 8.5 归并排序 8.6 分配排序 8.7 各种内排序方法比较 8.1 基本概念 排序:整理数据表中的记录,使得它按关键字递增或 递减的次序排列起来。例 内排序 内排序是指在排序期间数据对象全部存放在内存的排序 外排序 外排序是指在排序期间数据对象个数太多,不能同时存放在内存,必须根据排序过程的要求,不断在内、外存之间交换数据的排序。 内排序分类 ? 稳定性 如果在记录序列中有两 个记录Ri和Rj, 它们的关键字 ki = kj , 且在排序之前, 记录Ri排在Rj前面。如果在排序之后, 记录Ri仍在Rj的前面, 则称这种排序方法是稳定的, 否则称这个排序方法是不稳定的。 数据表存储结构 顺序存储 即用数组存储数据表,每条记录对应一个数组元素,排序过程是对记录本身,即数组元素,进行物理重排。 存储结构定义 Typedef struct { int key; datatype other; } Rectype; Rectype R[n]; 8.2 插入排序 基本思想 已知待排序记录存放在数组R[n]中,当排序进行到某一时刻,数组R[n]被分为两部分,R[1], …, R[i-1]已经排好序,称其为有序区,R[i], …, R[n-1]称为无序区。直接插入排序就是将当前无序区的第一个记录R[i]插入到有序区的适当位置,使得R[1], …, R[i]成为新的有序区,直至无序区为空。 算法分析 算法分析 ? 时间复杂度 最坏情况:排序前记录按关键字从大到小顺序排列。将当前无序区的第一条记录R[i]进行插入时,有序区的记录关键字均比R[i]大,则该记录必须R[i-1]到R[0]都进行比较, 插入R[i]所要进行的比较次数为i,While循环内进行的移动次数为i-1,与“监视哨”间进行2次记录移动,则 插入R[i]的总移动次数为i+1,所以n条记录都插入完毕所要进行的总关键字比较总次数Cmax和记录移动总次数Mmax分别为 8.2.2 希尔排序 (Shell Sort) 基本思想 设有n个待排序关键字, 首先取一个整数dn,将全部关键字分为d个组,所有距离为d的关键字放在同一个组中,在每一组中分别施行直接插入排序。然后缩小d,例如取d= ?d/2?,重复上述的组划分和排序工作。直到最后取d==1,将所有对象放在同一个序列中排序为止。 8.3 交换排序 基本思想 设n个待排序关键字R[0],R[1],…,R[n-1]。第 i趟起泡排序从R[n-1]到R[i]依次比较相邻两个记录的关 键字(i=0,1,…n-2),如果发生逆序,则交换之,其结果 是这n-i个记录中,关键字最小的记录被交换到第i个的 位置上。 起泡排序的算法 8.3.2 快速排序 基本思想 任取待排序关键字中的某个对象 (例如取第一个对象) 作为基准, 按照该对象的关键字大小,将整个对象序列划分为左右两个子序列: 左侧子序列中所有对象的关键字都小于或等于基准对象的关键字 右侧子序列中所有对象的关键字都大于基准对象的关键字 算法分析 最好情况:基准是当前无序区的中值元素。即每次对基准对象正确定位后, 正好把序列划分为长度相等的两个子序列, 此时, 总的计算时间为: 快速排序是递归的,需要有一个栈存放每层递归调用时的指针和参数。最大递归调用层次数与递归树的高度一致,理想情况为 ?log2(n+1)? 。因此,要求存储开销为 O(log2n)。 8.4 选择排序 8.4.2 堆排序 筛选法调整大根堆的算法 基于大根堆的堆排序 1、建立初始大根堆。 2、选取堆顶记录R[1]与最后一个记录R[n]交换 3、将当前无序区记录R[1],…,R[i](i=n-1,…2)调整成一个大根堆,并将堆顶记录R[1]与当前无序区的最后一个记录R[i]交换 4、反复执行步骤3,直到全部记录按顺序排好。 算法分析 若设堆中有n个结点,对应的完全二叉树有h层。形成初始堆的算法中对每一个非叶结点调用了一次堆调整算法SIFT( ),而非叶结点可能处于完全二叉树的第h-1,h-2,…,1层,若在第i层上(i=h-1, …,1) ,则以该结点为根的子树深度为h-i+1。深度为k的二叉树调整成堆最多需要进行2(k-1)次比较,而第i层上最多有2i-1个结点,建立初始堆需要的最多比较次数为: 重建堆中,调用了n-1次SIFT( )算法。第j次重建堆时,未排序的结点数为n-j,则被调整的二叉树深度为?log2(n-j)? +1,比较次数为2 ?log2(n-j)? 。 n-1次重建堆的比

文档评论(0)

ipbohn97 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档