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

数据结构08排序算法1.ppt

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

(m)重建的堆R[1]到R[2] 13 05 16 23 24 42 88 91 13 05 16 23 24 42 88 91 筛选算法 (n)第七趟排序之后 05 13 16 23 24 42 88 91 05 13 16 23 24 42 88 91 筛选算法 HeapSort(rectype R[]) { int i; rectype temp; for (i=n/2;i=1;i--) SIFT(R,i,n); for (i=n;i=1;i--) { temp=R[1]; R[1]=R[i]; R[i]=temp; SIFT(R,1,i-1); } } 堆排序算法 堆排序的时间复杂度 堆排序的时间复杂性为O(n log2n) 空间复杂性为 O(1) 堆排序是不稳定的排序方法。 设C(n)表示对长度为n的序列进行快速排序所需的比较次数,显然,它应该等于对长度为n的无序区进行划分所需的比较次数n-1,加上递归地对划分所得的左右两个无序子区进行快速排序所需的比较次数。假设文件长度n=2k ,k=log2n,因此有: 快速排序的时间复杂度 快速排序的记录移动次数不会大于比较次数,所以,快速排序的最坏时间复杂度为O(n2);最好时间复杂度为O(nlog2n)。 可以证明,快速排序的平均时间复杂度也是O(nlog2n)。 快速排序是不稳定的排序方法。 快速排序的时间复杂度 选择排序 选择排序: 直接选择排序 堆排序 基本原理: 将待排序的结点分为已排序(初始为空)和未排序两组,依次将未排序的结点中值最小的结点插入已排序的组中。 直接选择排序 在一组对象V[i]到V[n-1]中选择具有最小关键字的对象 若它不是这组对象中的第一个对象,则将它与这组对象中 的第一个对象对调。 删除具有最小关键字的对象,在剩下的对象中重复第(1)、 (2)步,直到剩余对象只有一个为止。 49 38 65 97 76 13 27 49’ 13 38 65 97 76 49 27 49’ 13 27 65 97 76 49 38 49’ 13 27 38 97 76 49 65 49’ 13 27 38 49 76 97 65 49’ 13 27 38 49 49’ 97 65 76 13 27 38 49 49’ 65 97 76 13 27 38 49 49’ 65 76 97 直接选择排序 Selectsort(rectype R[]) { int i, j, k; rectype temp; for (i=0;in-1;i++) { k=i; for (j=i+1;jn;j++) if (R[j].keyR[k].key) k=j; if (k!=i) { temp=R[i]; R[i]=R[k]; R[k]=temp; } } } 直接选择排序算法 直接选择排序 2、当文件为正序时,移动次数为0,文件初态为反序时,每趟排序均要执行交换操作,总的移动次数取最大值3(n-1)。 直接选择排序是不稳定的排序方法。 1、无论初始状态如何,在第i趟排序中选择最小关键字的记录,需做n-i次比较,因此总的比较次数为: 堆排序 堆排序是一种树型选择排序。 在排序过程中,将R[1]到R[n]看成是一个完全二叉树顺序存 储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关 系来选择关键字最小记录。 堆排序分为两个步骤: 1、根据初始输入,形成初始堆。 2、通过一系列的对象交换和重新调整进行排序。 堆的定义 n个关键字序列K1, k2, ... ,Kn称为堆,当且仅当该序列满足特性: 从堆的定义可以看出,堆实质上是满足如下性质的二叉树:树中任一非叶子结点的关键字均小于或等于它的孩子结点的关键字。 10 15 56 25 30 70 10 15 56 25 30 70 小根堆示例 堆排序 70 56 30 25 15 10 70 56 30 25 15 10 大根堆示例 堆排序 堆排序的第一个工作是建堆,即把整个记录数组R[1]到R[n]调整为一个堆。显然,只有一个结点的树是堆,而在完全二叉树中,所有序号i = low(n/2)的结点都是叶子,因此以这些结点为根的子树都已是堆。这样,我们只需依次将序号为low(n/2),low(n/2)-1,...,1的结点作为根的子树都调整为堆即可。 以大根堆为例进行说明 堆排序 若已知结点R[i]的左右子树已是堆,如何将以R[i]为根的完全二叉树也调整为堆? 解决这一问题可采用“筛选法”,其基本思想是:因为R[i]的左右子树已

文档评论(0)

173****7830 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档