- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
10.1 排序的基本概念 例如: 对数据5,3,8,3,6,6进行排序 若排序后的序列是3, 3 ,5,6, 6 ,8,则是稳定的, 若排序后的序列是3 , 3, 5, 6 , 6, 8,则是不稳定的。 8.2 插入排序 8.2.1 直接插入排序 8.2.2 折半插入排序 8.2.3 希尔排序 8.3交换排序 8.3.3 快速排序 8.4选择排序 8.4.2 堆排序 8.5归并排序 8.6基数排序 8.7外部排序 8.7.1外部排序过程 8.7.2多路平衡归并 8.7.3置换一选择排序 8.8各种排序方法的比较 本章小结 在8.7.1中曾经给出,m个初始归并段进行k-路平衡归并的趟数s为 ?logkm?,要想减少趟数s,减小m也是一条途径。置换-选择排序就是通过减小m提高外部排序效率的一种方法。 置换-选择排序的基本思想是:在产生所有初始归并段的过程中,使选择最小(或最大)关键字过程中输入、输出交叉或平行地进行。 假设初始待排序文件为输入文件FI,初始归并段文件为输出文件FO,内存工作区为WA,FO和WA的初始状态为空,并设内存工作区WA可容纳w个记录,则置换-选择排序的基本步骤如下: (1) 在输出文件FO中标记第一个归并段(i=1)的开始。 (2) 从待排文件FI中读入w个记录到工作区WA,并为每一个记录标记段号i=l。 (3) 使用败者树从WA中的段号为j的记录中选出关键字最小的记录,将其记入Minimax。 (4) 将该记录输出到FO中。 (5) 若FI不空,则从FI输入下一个记录到WA中。 (6) 从WA中所有关键字比Minimax记录的关键字大的记录中选出最小关键字记录,作为新的Minimax 记录。 (7) 重复步骤(4)~(6),直到在WA中选不出新的Minimax记录为止,由此得到一个初始归并段,输出一个归并段结束标志。 (8)重复步骤(3)~(7),直到WA为空,得到全部初始归并段。 【例8-11】设文件中共有18个记录,记录的关键字分别为{15,4,97,64,17,32,108,44,76,9,39,82,56,3l,80,73,255,68},内存工作区可容纳5个记录。 【解】初始归并段的生成过程如表8-1所示。 3.堆排序 对于已建好的堆,可以采用下面两个步骤进行排序: (1) 输出堆顶元素:将堆顶元素(第一个记录)与当前堆的最后一个记录对调。 (2) 调整堆:将输出根结点之后的新完全二叉树调整为堆。 不断地输出堆顶元素,又不断地把剩余的元素建成新堆,直到所有的记录都变成堆顶元素输出。 堆排序的算法描述如下: void Heap_Sort(RecType R[],int n) { int j; for(j=n/2;j0;--j) //建初始堆 Sift(R,j,n); for(j=n;j1;--j){ //进行n-1趟排序 R[0]=R[1]; //将堆顶元素与堆中最后一个元素交换 R[1]=R[j]; R[j]=R[0]; Sift(R,l,j-1); //将R[1]..R[j-1]调整为堆 } } 【例8-7】用“筛选法”在如图8-9(f) 的堆中进行排序。 【解】调用筛选运算进行堆排序的过程如图8-10 (a)~(n)所示。 (a)初始堆 (b)交换05和37 (c) 重建堆,筛选37下移一层 (d)交换16和56 (e) 重建堆,筛选56下移两层 (f)交换24和48 (g) 重建堆,筛选48下移一层 (h)交换37和61 (i) 重建堆,筛选61下移一层 (j) 交换37和56 (k)重建堆,筛选56下移一层 (l) 交换48和61 (m) 重建堆,筛选61下移一层 (n) 交换56和61 图8-10 堆排序示例 对堆排序算法主要由建立初始堆和反复重建堆两部分构成,它们均通过调用Sift()实现。假设具有n个记录的初始序列对应的完全二叉树的深度为h= ,则在建立初始堆时,对每一个非叶子结点都要从上到下做“筛选”,则建立初始堆的总比较次数C1为: ≤ 其时间复杂度为O(n)。n个结点完全二叉树的深度为 ,n-1次建新堆的总比较次数C2为: ≤ ≤ 堆排序所需的关键字比较的总次数是: + = O(nlog2n) 类似地,可求出堆排序所需的记录移动的总次数为:O(nlog2n),因此堆排序的最坏时间复杂度为O(nlog2n)。堆排序算法一般适合于待排序记录数比较多的情况。 堆排
原创力文档


文档评论(0)