- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[工学]数据结构课件9
问题二:对n个元素初始建堆的过程。 建堆方法:对初始序列建堆的过程,就是一个反复进行筛选的过程。 n个结点的完全二叉树,则最后一个结点是第 个结点的孩子结点。对第 个结点为根的子树筛选,使该子树成为堆,之后向前依次对各结点为根的子树进行筛选,使之成为堆,直到根结点。图9.13给出了“建堆”过程示例。 void sift(RecordType r[], int k, int m) { t=r[k] ; /* 暂存“根”记录r[k] */ x=r[k].key; i=k; j=2*i; finished=FALSE; while(j=m!finished) {if(jmr[j].keyr[j+1].key) j=j+1; /* 若存在右子树, 且右子树根的关键字大, 则沿右分支“筛选” */ if(x=r[j].key) finished=TRUE ; /* 筛选完毕 */ else { r[i]=r[j];i=j;j=2*i; } /* 继续筛选 */ } r[i]=t ; /* r[k]填入到恰当的位置 */ } /* sift */ 建堆算法如下: void crt-heap(RecordType r[ ], int length ) { n=length; for(i=n/2; i= 1; --i) /* 自第个记录开始进行筛选建堆 */ sift(r,i,n) ; } 堆排序的算法如下: void HeapSort(RecordType r[], int length) { crt-heap(r, length); n=length; for ( i=n; i=2; --i) {b=r[1]; /* 将堆顶记录和堆中的最后一个记录互换 */ r[1]=r[i] r[i]=b; sift(r,1,i-1); /* 进行调整, 使r[1..i-1]变成堆 */ } } /* HeapSort */ 堆排序在最坏情况下,其时间复杂度也为O(nlog2n), 这是堆排序的最大优点。 堆排序与树形排序相比较,排序中只需要存放一个记录的辅助空间,因此也将堆排序称作原地排序。 堆排序是一种不稳定的排序方法。 9.3.4 基数排序** 基数排序(radix sorting)是和前几节讨论的排序方法完全不同的一种排序方法。 从前几节的讨论可见,实现排序主要是通过关键字之间的比较和移动记录这两种操作来完成的; 实现基数排序不需要进行关键字间的比较,而基数排序是一种借助于多关键码排序的思想,是将单关键码按基数分成“多关键码”进行排序的方法。 1. 多关键码排序 例如,可以用分配和收集的方法来对扑克牌进行“排序”。扑克牌中52张牌,按花色和面值分成两个字段,大小关系为: 花色: 梅花方块红心黑桃 面值: 2345678910JQKA 一般情况下,设n个元素的待排序列{R1,R2,…,Rn},且每个记录包含d个关键码{k1,k2,…,kd},则称序列对关键码{k1,k2,…,kd}有序是指:对于序列中任两个记录R[i]和R[j](1≤i≤j≤n)都满足下列有序关系: 分两种方法 最高位优先(Most Significant Digit first)法,简称MSD法:先按k1排序分组,同一组中记录,关键码k1相等,再对各组按k2排序分成子组,之后,对后面的关键码继续这样的排序分组,直到按最次位关键码kd对各子组排序后。再将各组连接起来,便得到一个有序序列。扑克牌按花色、面值排序中介绍的方法一即是MSD法。 最低位优先(Least Significant Digit first)法,简称LSD法:先从kd开始排序,再对kd-1进行排序,依次重复,直到对k1排序后便得到一个有序序列。扑克牌按花色、面值排序中介绍的方法二即是LSD法。 void BubbleSort(SqList *
文档评论(0)