用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - c代码库

外排序(多路平衡归并的实现)

2012-10-11 作者: 神马举报

[c]代码库

typedef int LoserTree[k]; /*败者树是完全二叉树且不含叶子,可采用顺序存储结构*/
typedef struct
{
	KeyType key;
} ExNode,External[k]; /*外结点,只存放待归并记录的关键码*/
void K_Merge ( LoserTree *ls,External *b ) /*k-路归并处理程序*/
{ /*利用败者树ls 将编号从0 到k-1 的k 个输入归并段中的记录归并到输出归并段*/
	/*b[0]到b[k-1]为败者树上的k 个叶子结点,分别存放k 个输入归并段中当前记录的关键码*/
	for ( i=0; i<k; i++ ) input ( b[i].key ); /*分别从k 个输入归并段读入该段当前第一个记录的*/
	/*关键码到外结点*/
	CreateLoserTree ( ls ); /*建败者树ls,选得最小关键码为b[0].key*/
	while ( b[ls[0]].key!=MAXKEY )
	{
		q=ls[0]; /*q 指示当前最小关键码所在归并段*/
		output ( q ); /*将编号为q 的归并段中当前(关键码为b[q].key 的记录写至输出归并段)*/
		input ( b[q].key ); /*从编号为q 的输入归并段中读入下一个记录的关键码*/
		Adjust ( ls,q ); /*调整败者树,选择新的最小关键码*/
	}
	output ( ls[0] ); /*将含最大关键码MAXKEY 的记录写至输出归并段*/
}
void Adjust ( LoserTree *ls,int s ) /*选得最小关键码记录后,从叶到根调整败者树,选下一个最小关键码*/
{ /*沿从叶子结点b[s]到根结点ls[0]的路径调整败者树*/
	t= ( s+k ) /2; /*ls[t]是b[s]的双亲结点*/
	while ( t>0 )
	{
		if ( b[s].key>b[ls[t]].key ) s<-->ls[t]; /*s 指示新的胜者*/
		t=t/2;
	}
	ls[0]=s;
}
void CreateLoserTree ( LoserTree *ls ) /*建立败者树*/
{ /*已知b[0]到b[k-1]为完全二叉树ls 的叶子结点存有k 个关键码,沿从叶子到根的k 条路径*/
	/*将ls 调整为败者树*/
	b[k].key=MINKEY; /*设MINKEY 为关键码可能的最小值*/
	for ( i=0; i<k; i++ ) ls[i]=k; /*设置ls 中“败者”的初值*/
	for ( i=k-1; k>0; i-- ) Adjust ( ls,i ); /*依次从b[k-1],b[k-2],…,b[0]出发调整败者*/
}



网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...