网站大量收购闲置独家精品文档,联系QQ:2885784924

排序数据结构 教学PPT课件.ppt

  1. 1、本文档共65页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
例如,一组待排序的记录的关键字如下,要求按照关键字由小到大进行排序。 45 38 63 85 71 17 28 45 6 90(n=10) 按di+1= di/2 选取增量序列,具体排序的程序如下: 8.2 插入排序 从以上结果发现排序前序列中的第一条记录和第八条记录的关键字相同,在排序后它们的相对位置与排序前的相对位置颠倒了,因此希尔排序是一种不稳定的排序方法。 在待排序的记录数目较大的情况下,希尔排序方法一般要比直接插入排序方法快。 其时间复杂度与所选取的增量序列有关,是所取增量序列的函数,介于O(nlog2n)和O(n2)之间。增量序列有多种取法,但应使增量序列中的值没有除1之外的公因子,并且增量序列中的最后一个值必须为1。 从空间复杂度来看,与直接插入排序一样,希尔排序也只需要一个记录大小的辅助空间,用于暂存当前待插入的记录。 8.2 插入排序 8.3 选择排序 选择排序(Selection Sort)的基本思想是:每一趟从待排序的序列中选出关键字最小的记录,顺序放在已排好序的子序列的最后,直到全部记录排序完毕。常用的选择排序方法有简单选择排序和堆排序。 简单选择排序的基本思想是:将整个序列(假设含有n条记录)分为有序区和无序区,初始时有序区为空,无序区为整个待排序序列。 第1趟排序,从无序区的n个记录中选取最小的记录与序列中的第一条记录交换位置,它做为有序区的第一条记录,此时无序区剩下n-1条记录; 第2趟排序,从无序区的n-1条记录中选取最小的记录与序列中的第二条记录交换位置,它做为有序区的第二条记录,此时无序区剩下n-2条记录…… 第i趟排序,从无序区的n-i+1条记录中选取最小的记录与序列中的第i条记录交换,它做为有序区的第i条记录,此时无序区剩下n-i条记录; 如此反复,n个记录的可经过n-1 趟简单选择排序得到有序结果。 8.3.1 简单选择排序 8.3 选择排序 例如,一组待排序的记录的关键字如下,要求按照关键字由小到大进行排序。 8.3 选择排序 简单选择排序算法简单,但是速度较慢,时间复杂度为O(n2),并且是一种不稳定的排序方法,在排序过程中也只需要一个用来交换记录的暂存单元作为辅助空间。 8.3 选择排序 8.3.2 堆排序 堆排序(Heap Sort)是利用堆的特性进行排序的过程。堆的定义如下: n个元素的序列为{K1,K2,…,Kn}, 当且仅当满足下列关系时,称之为堆。 Ki≤K2iKi≤K2i+1或Ki≥K2iKi≥K2i+1(i=1,2,…,n/2) 若将与此序列对应的一维数组看成是一棵完全二叉树按层次编号的顺序存储,则堆的含义表明,完全二叉树中所有非终端结点的值均不小于(或不大于)其左、右孩子结点的值。因此,堆顶元素的值必为序列中的最大值或最小值(即大顶堆或小顶堆)。 8.3 选择排序 堆排序的基本思想是:对一组待排序的记录,首先把它们按堆的定义排成一个堆,将堆顶元素取出;然后把剩下的记录再排成堆,取出堆顶元素;依次下去,直到取出全部元素,从而将全部记录排成一个有序序列。 8.3 选择排序 实现堆排序需要解决两个问题: (1)如何将一个无序序列建成一个堆? (2)如何在输出堆顶元素之后,调整剩余元素成为一个新的堆? 建堆就是把待排序的记录序列{R1,R2,…,Rn},按照堆的定义调整为堆,使父结点的关键字大于(或小于)子结点的关键字。为此,我们先把待排序数据初始次序置入完全二叉树的各个结点中,然后由下而上逐层进行父子结点的关键字比较并交换,直到使其最后满足堆的条件。 建堆时是从最后一个非终端结点 n/2 开始的。 8.3 选择排序 例如,假定待排序的一组数据序列为: 42 36 56 78 67 11 27 36 对上述待排序序列建成堆之后,输出堆顶元素并调整成新堆的过程如图所示。 8.3 选择排序 对一组有n个记录的待排序序列进行按关键字非递减排序时,先建立一个大顶堆,然后选取关键字值最大的堆顶记录与最后一个记录交换,再对前n-1个记录调整为一个新的大顶堆,如此反复直到排序结束。 8.3 选择排序 void heapadjust(int r[],int s,int m { int rc,j; /*rc暂存记录的关键字*/ rc=r[s]; /*记录关键字送rc*/ for(j=2*s;j=m;j*=2) /*沿关键字较大的孩子结点向下搜索调整*/ { if((jm)(r[j]=r[j+1])) ++j; /*若右孩子大于左孩子,则j为右孩

文档评论(0)

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

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

1亿VIP精品文档

相关文档