- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
8内部排序
第8章 排序 8.1 概述 8.1.3 稳定性 若记录序列中的任意两个记录 Rx、Ry 的 关键字 Kx = Ky ;如果在排序之前和排序之后, 它们的相对位置保持不变,则这种排序方法是 稳定的,否则是不稳定的。 例如: ……ki…….kj…….. 排序后:……….kikj……….. ki==kj, ij, 排序过程中ki和kj的位置始终 不会被改变。 8.1.4 排序所涉及的操作 (1)比较,基于关键字(key) (2)移动,对于整条记录 8.4 选择排序 8.4.2 树型排序 8.4.2 树型排序 8.4.2 树型排序 8.4.2 树型排序 8.4.2 树型排序输出13, 8.4.2 树型排序输出13, 8.4.2 树型排序输出13, 8.4.2 树型排序输出13, 8.4.2 树型排序输出13,27, 8.4.2 树型排序输出13,27, 8.4.2 树型排序输出13,27, 8.4.2 树型排序输出13,27, 8.4.2 树型排序输出13,27,38 8.4.3 堆排序 二、排序策略 (1)构造堆 按堆的定义将r[1]..r[n]调整为堆。 (2)r[n]与r[1]互换,将r[1]..r[n-1]调整为堆。再将r[n-1]与 r[1]互换,将r[1]..r[n-2]调整为堆。……,直至排序完成。 问题:如何实现堆的调整? 用筛选法实现。 (1)左右孩子比较 (2)父子比较 void sift ( int i, int m){ //筛选算法 //把以 t 为根的完全二叉树r[i]..r[m]调整成一个堆 //初值:i的左右子树均是堆 int j=i*2; //j指向左孩子 r[0]=r[i] //将r[i]暂存到r[0]中 while (j=m) { if ( jm r[j].keyr[j+1].key ) j++; // 左孩子与右孩子进行比较, 找较大孩子,确定筛选的方向 if ( r[0].key r[j].key ) { r[i] = r[j]; i=j; j=2*i; } //继续筛选 else j=m+1; //筛选完毕 } r[i] = r[0]; } void heatsort ( ){ // 将r[1]..r[n]进行堆排序 for (j=n/2;j=1;j--) Sift ( j, n ) //建堆,得最大值r[1] for (j=n;j=2;j--){ r[0]=r[1]; r[1]=r[j]; r[j]=r[0]; //堆顶(根)结点与最后结点的值对换 sift (1, j-1 ) ; //调整堆 } } 六、算法分析 (1)时间分析 sift(j,n)的时间是O(log2n)。 建立堆的过程O(n)。 堆排序的时间=建立堆+(n-1)次调整堆 T(n)=O (nlog2n) (2)空间分析 S(n)=O(1) (3)稳定性 堆排序方法是不稳定的排序方法。因为父子比较及交换是在第i个元素和第2i个元素或第2i+1元素之间进行,在移动过中原两个相同大小的记录的位置会有变化。 七、适用范围 (1)n较大。 (2)选取前k(k)个最小元素时。 八、进一步思考 以链表为存储结构,可以实现该算法吗? 比较堆排序与直接选择排序? 8.5 归并排序 一、排序策略 将两个有序表归并为一个新的有序表。 二、排序示例 三、排序算法 void merge (int h, int m, int n){ // 将两个有序表r[h]..r[m]和r[m+1]..r[n]归并为一个新的有序表r[h]..r[n] i=h; j=m+1; k=h; //初值, i,j,k为 指示器 while( i=m j=n ) { if (r[i].key = r[j].key) s[k++]=r[i++]; else s[k++]=r[j++];
文档评论(0)