置换-选择排序
来源:互联网 发布:颈椎按摩器 知乎 编辑:程序博客网 时间:2024/05/29 19:27
外部排序过程中,为了减少外存读写次数需要减小归并趟数(外部排序的过程中用到归并),归并趟数为:(其中k为归并路数,n为归并段的个数)。增加k和减小n都可以达到减小归并趟数的目的。置换-选择排序就是一种减小n的、在外部排序中创建初始归并段时用到的算法。它可以让初始归并段的长度增减,从而减小初始归并段的段数(因为总的记录数是一定的)。
置换-选择排序是在树形选择排序的基础上得来的,它的特点是:在整个排序(得到初始归并段)的过程中,选择最小(或最大)关键值和输入、输出交叉或并行进行。它的主要思路是:用败者树从已经传递到内存中的记录中找到关键值最小(或最大)的记录,然后将此记录写入外存,再将外存中一个没有排序过的记录传递到内存(因为之前那个记录写入外存后已经给它空出内存),然后再用败者树的一次调整过程找到最小关键值记录(这个调整过程中需要注意:比已经写入本初始归并段的记录关键值小的记录不能参见筛选,它要等到本初始段结束,下一个初始段中才可以进行筛选),再将此最小关键值记录调出,再调入新的记录.......依此进行指导所有记录已经排序过。内存中的记录就是所用败者树的叶子节点。
假设初始待排序文件为FI,初始归并段文件为输出文件FO,内存工作区为WA,FO与WA的初始状态为空,并假设内存工作去WA的容量可容纳w个记录,则置换-选择排序的操作的过程为:
在WA中选择MINIMAX记录的过程利用“败者树”来实现。就置换-排序中败者树的实现细节这里加以说明。(1)、内存空间中的记录做为败者树的外部节点,而败者树中根节点的双亲节点指示工作区中关键字最小的记录。(2)、为了便于选择MINIMAX记录,为每个记录附设一个所在归并段的序号,在进行关键字的比较时,先比较段号,段号小的为胜者;段号相同的则关键字小的为胜者;(3)、败者树的建立可以从设工作区中所有记录的段号为0开始,让后从FI逐个输入w个记录到工作区时,自下而上调整败者树,由于这些记录的段号为1,则他们对于0段的记录来说均为败者,从而逐个填充到败者树的各节点中去。
下面是几个置换排序中用到的函数(伪代码):
typedef struct
{
}RcNode,WorkArea[w];
typedef int LoserTree[w];
//在败者树ls和内存工作区wa上用置换-选择排序求初始归并段,fi为输入文件指针,fo为输出文件指针,
//两个文件均已打开
void Replace_Selection(LoserTree &ls,WorkArea&wa,FILE* fi,FILE* fo)
{
}
//求得一个初始归并段,fi为输入文件指针,fo为输出文件指针
void get_run(LoserTree &ls,WorkArea&wa)
{
}
//从wa[q]起到败者树的根比较选择MINIMAX记录,并有q指示它所在的归并段
void Select_MiniMax(LoserTree &ls,WorkAreawa,int q)
{
}
//输入w个记录到内存工作区wa,建得败者树ls,选出关键字最小的记录并由s指示器在wa中的位置
void
{
}
- 置换-选择排序
- 置换-选择排序
- 置换-选择排序
- 置换选择排序
- 置换选择排序
- python算法--置换选择排序详细实现
- 选择置换+败者树搞定外部排序
- 选择置换+败者树搞定外部排序
- C++代码,数据结构-外部排序-置换-选择排序
- 第十一章(2).置换—选择排序
- 7.7.4 置换选择排序(生成初始归并段)
- C++外部排序(选择置换+败者树)
- 数据结构与算法习题 replacement selection sort(置换选择排序)
- 外排序-置换选择排序,赢者树,败者树
- 原地置换排序
- 看数据结构写代码(67) 置换 _ 选择排序(完结篇)
- 第16周外部排序【项目-1】置换-选择算法模拟
- 3270 Cow Sorting //利用置换排序
- 等概率产生器
- 归并排序
- 外部排序1
- 归并排序-败者树
- fork函数
- 置换-选择排序
- 给你一支笔,你如何测试
- 给你一个杯子,你如何测试
- cocos2d-x初学笔记02:一些概念
- 三角形测试用例
- 用Pdh库获得CPU利用率
- 输出错误代码对应的文本
- 位域(unsigned char a:4的解释)
- 分治方法实现求一个数组的逆序数