数据结构第10章_内排序.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
建堆总体控制: for(i= L-length/2 ;i=1;i--) sift (L, i, L-length); /*对所有元素建堆*/ 堆排序过程: 1)建初始堆(大根堆) 2)重复以下工作,一直到排序结束 交换截尾 重新建堆 for(i=L-length;i=2;i--) 请同学们将堆排序过程补充完整。 void heapsort(table *L) { } int i; for(i=L-length/2;i=1;i--) sift(L,i,L-length); /*对所有元素建堆*/ for(i=L-length;i=2;i--) /* i表示当前堆的大小,即等待排序的元素的个数*/ { } L-r[0]=L-r[i]; L-r[i]=L-r[1]; L-r[1]=L-r[0]; /*上述3条语句为将堆中最小元素和最后一个元素交换*/ sift(L,1,i-1); 若设堆中有 n 个结点,且 2k-1 ? n ? 2k,则对应的完全二叉树有 k 层。在第 i 层上的结点数 ? 2i (i = 0, 1, …, k-1)。在第一个形成初始堆的for循环中对每一个非叶结点调用了一次堆调整算法 sift( ),因此该循环所用的计算时间为: 算法分析: 其中,i 是层序号,2i 是第 i 层的最大结点数,(k-i-1)是第 i 层结点能够移动的最大距离。 在第二个for循环中,调用了n-1次sift()算法,该循环的计算时间为O(nlog2n)。因此,堆排序的时间复杂性为O(nlog2n)。 该算法的附加存储主要是在第二个for循环中用来执行对象交换时所用的一个临时对象。因此,该算法的空间复杂性为O(1)。 堆排序是一个不稳定的排序方法。 练习: 1、给出初始数列{ 47、28、32、15、94、33、14、16}在堆排序下的建堆过程及示意图。 2、下列四个选项中,哪一个序列组成一个最小堆? a)20、76、35、23、80、54 b)20、54、23、80、35、76 c)80、23、35、76、20、54 d)20、35、23、80、54、76 答案:d 算法设计题: 1、写一个Heapinsert(r,key)算法,将关键字插入到堆r中,并保证插入后r后仍是堆。 2、写一个建堆算法:从空堆开始,依次读入元素调用上题中堆插入算法将其插入堆中。 3、写一个堆删除算法heapdelete(r,i),将r[i]从堆r中删去。 10.4交换排序 交换排序的基本思路: 对待排序记录两两进行排序码比较,若不满足排序顺序则交换这对记录,直到任何两个记录的排序码都满足排序要求为止。 快速排序 冒泡排序 第1趟,对所有记录从左到右每相邻两个记录的排序码进行比较,如果这两个记录的排序码不符合排序要求,则进行交换,这样一趟做完,将排序码最大者放在最后一个位置; 第2趟对剩下的n-l个待排序记录重复上述过程,又将一个排序码放于最终位置,反复进行n-l次,可将n-l个排序码对应的记录放至最终位置,剩下的即为排序码最小的记录,它在第1的位置处。 如果在某一趟中,没有发生交换,则说明此时所有记录已经按排序要求排列完毕,排序结束。 10.4.1 冒泡排序 一趟冒泡:对数列中指定的起点到终点间的数据进行连续冒泡。 47 28 32 15 94 33 14 16 例: 28 47 32 15 94 33 14 16 32 47 28 15 94 33 14 16 15 47 28 32 94 33 14 16 15 47 28 32 94 33 14 16 33 94 15 47 28 32 14 16 14 94 15 47 28 32 33 16 16 94 15 47 28 32 33 14 void bubblesort(table *L) /*冒泡排序*/ { int i,j,flag; i=L-length; /*变量i记录参与冒泡排序的元素个数*/ while (i1) { flag=0; for (j=0;ji;j++) if (L-r[j].keyL-r[j+1].key) /*逆序则交换*/ { L-r[0]=L-r[j]; L-r[j]=L-r[j+1]; L-r[j+1]=L-r[0]; flag=1; } if (flag==0) break;        i--;       

文档评论(0)

132****9295 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档