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

[理学]9排序技术.ppt

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

简单选择排序算法的C语言描述: insort(ET P[],int n) { int j,k; ET d; for(i=0;i=n-2;i++) { k=i; for(j=i+1;j=n-1;j++) if(p[j]p[k]) k=j; if(k!=i) { d=p[i];p[i]=p[k];p[k]=d;} } return; } 堆的定义:   具有n个元素的序列(h1,h2,…,hn),当且仅当满足 堆排序定义 hi = h2i hi = h2i+1 hi = h2i hi = h2i+1 或 (i=1,2,…,n/2) 时称之为堆。   我们只讨论满足前者条件的堆。   由堆的定义可以看出,堆顶元素(即第一个元素)必为最大项。 堆排序(Heap Sort)是利用二叉树的一种排序方法。 堆(Heap)是与二叉排序树不同的一种二叉树,它的定义为:一个完全二叉树,它的每个结点对应于原始数据的一个元素,且规定如果一个结点有儿子结点,此结点数据必须大于或等于其儿子结点数据。 由于堆是完全二叉树,采用将结点顺序编号存入一维数组中的表示法比链接表示法节省存储空间,也便于计算。 堆排序属于选择类的排序方法 堆的示意图(堆顶元素最大) 序列(91,85,53,36,47,30,24,12)是一个堆,如图: 91 85 53 36 47 30 24 12 在一棵具有n个结点的完全二叉树(用一维数组H(1:n)表示)中,假设结点H(m)的左右子树均为堆,现要将H(m)为根结点的子树也调整为堆,这就是调整建堆的过程。 调整建堆示意图   (a)      (b)      (c) 47 91 53 85 30 12 24 36 91 47 53 85 30 12 24 36 91 85 53 47 30 12 24 36 调整建堆的过程总是将根结点值与左右子数的根结点值进行比较,若不满足堆的条件,则将左右子树根结点值中的大者与根结点值交换,该过程一直到所有子树均为堆为止。 [算法9.8] 调整建堆 输入:完全二叉树数组H(1:n)。其中结点H(m)的左、右子树均为堆。 输出:以H(m)为根结点的子树为堆。 PROCEDURE SIFT(H,n,m) t=H(m);j=2m WHILE (j≤n) DO { IF(jn)and(H(j)H(j+1)) THEN j=j+1 IF (tH(j)) THEN { H(m)=H(j);m=j;j=2m } else j=n+1 } H(m)=t RETURN 完全二叉树中的所有结点值是从根结点开始一层一层地从 左到右存储在一维数组H中。而对于完全二叉树的顺序存 储结构来说,结点k的左子树根结点为2k,右子树的根结点 为2k+1。因此算法中没有用到指针运算,而只用到数组的 下标运算。 有了调整建堆的算法后,就可以将一个无序序列建成为堆。 假设无序序列H(1:n)以完全二叉树表示。从完全二叉树的最后一个非叶子结点(即第n/2个元素)开始,直到根结点(即第一个元素)为止,对每一个结点进行调整建堆,最后就可以得到与该序列对应的堆。 堆排序 (1)首先将一个无序序列建成堆。 (2)然后将堆顶元素(序列中的最大项)与堆中最后一个元素交换(最大项应该在序列的最后)。不考虑已经换到最后的那个元素,只考虑前n-1个元素构成的子序列,显然,该子序列已不是堆,但左、右子树仍为堆,可以将该子序列调整为堆。 反复做第(2)步,直到剩下的子序列为空为止。 [算法9.9] 堆排序 输入:无序序列 H(1:n) 输出:有序序列 H(1:n) PROCEDURE HEAPSORT(H,n) k=n/2 FOR i=k TO 1 BY -1 DO SIFT(H,n,i) /*无序序列建堆*/ FOR i=n TO 2 BY -1 DO { t=H(1);H(1)=H(i);H(i)=t /*堆顶元素换到最后*/ SIFT(H,i-1,1) /*调整建堆*/ } RETURN 堆排序的方法对于规模较小的线性表并不适合,但对于 较大规模的线性表来说是很有效的。 排序操作是线性表上一种十分常用的操作,所以人们对排序方法作了大量的深入研究,已发明的排序算法远不止书上所介绍这些,它们各有特点和优缺点,没有一种方法在各种情况下都是最好的。 排序算法总结 排 序 算 法 冒泡排序 快速排序 简单插入排序 希尔排序 简单选择排序 堆排序 时间复杂性 平均情况 最好情况 最坏情况 稳 定 性 O(n2) O(n) O(n2) O(nlogn) O(nlogn) O(n2) O(n2)

文档评论(0)

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

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

1亿VIP精品文档

相关文档