请问一个外排序问题

student2007 2008-07-12 11:56:46
k 路平衡归并排序算法

void kwaymerge ( Element *r ) {
r = new Element[k]; //创建对象数组
int *key = new int[k+1]; //创建外结点数组
int *loser = new int[k]; //创建败者树数组
for ( int i = 0; i < k; i++ ) //传送参选关键码
{ InputRecord ( r[i] ); key[i] = r[i].key; }
for ( i = 0; i < k; i++) loser[i] = k;
key[k] = -MaxNum; //初始化
for ( i = k-1; i; i-- ) //调整形成败者树
adjust ( key, loser, k, i );
while ( key[loser[0]] != MaxNum ) { //选归并段
q = loser[0]; //最小对象的段号
OutputRecord ( r[q] ); //输出
InputRecord ( r[q] ); //从该段补入对象
key[q] = r[q].key;
adjust ( key, loser, k, q ); //调整
}
Output end of run marker; //输出段结束标志
delete [ ] r; delete [ ] key; delete [ ] loser;
}

void adjust ( int key[ ]; int loser[ ]; const int k;
const int q ) {
//q指示败者树的某外结点key[q], 从该结点起到根
//结点进行比较, 将最小 key 对象所在归并段的段
//号记入loser[0]。k是外结点key[0..k-1]的个数。
for ( int t = (k+q) / 2; t > 0; t /= 2 ) // t是q的双亲
if ( key[loser[t]] < key[q]) {
//败者记入loser[t], 胜者记入q
int temp = q; q = loser[t]; loser[t] = temp;
} //q与loser[t]交换
loser[0] = q;
}
这是清华殷人昆教授的数据结构page331-333的一个程序,我对ajust函数还不是很理解,我的问题是
1 t = (k+q) / 2为什么不是 (k+q-1)/2 ?t /= 2 为什么不是t-1/2,根节点不是等于[i-1/2]吗?这里i为叶节点
2 这里是如何确定一个完全二叉树的结构的?这里 key[loser[t]]放再这里是什么用意?起什么作用?谢谢
...全文
126 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
JavaerRobertLi 2008-09-01
  • 打赏
  • 举报
回复
C语言的除法运算是舍掉小数点后边内容的。
student2007 2008-07-28
  • 打赏
  • 举报
回复

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧