排序的算法很多,这里说明连接件的冒泡排序和归并排序的实现,以升序为例。
冒泡排序的原理:每一趟比较相邻两个连接件的数据部件,如果大值部件在前驱,则交换两个连接件的位置,使之成为后继,直至所有数据部件的值都按照升序排列。
归并排序的原理:递归划分连接件链表,直至最小划分,然后升序合并划分的连接件链表,直至所有的划分都被合并。
数据部件的比较通过调用回调函数的返回值来判断,回调函数有具体应用实现。
typedef
int
(
*
LinkSortCall)(LINKPTR plk1,LINKPTR plk2,
void
*
param);

/**/
/*
功能:定义连接件的排序的回调函数
参数:plk1,plk2为数据连接件指针,param为回传参数
返回:0为(plk1)=(plk2),1为(plk1)>(plk2),-1为(plk1)<(plk2)
*/
XDL_API
void
BubbleSortLink(LINKPTR root,LinkSortCall pf,
void
*
parm);

/**/
/*
功能:对链表进行冒泡排序
参数:root为根连接件指针,pf为排序回调函数,param为回调参数
返回:无
*/
XDL_API
void
MergeSortLink(LINKPTR root,LinkSortCall pf,
void
*
parm);

/**/
/*
功能:对链表进行归并排序
参数:root为根连接件指针,pf为排序回调函数,param为回调参数
返回:无
*/
void
BubbleSortLink(LINKPTR root,LinkSortCall pf,
void
*
parm)

...
{
LINKPTR prev,next;
int tag = 1;
assert(root && root->tag == lkRoot);
assert(pf);
while(tag)

...{
tag = 0;
prev = GetFirstLink(root);
while(prev)

...{
next = GetNextLink(prev);
if(next == NULL)
break;
if((*pf)(prev,next,parm) > 0)

...{
SwitchLinkToNext(prev);
tag = 1;
}else
prev = next;
}
}
}
//
划分连接件
int
_DivLink(LINKPTR root1,LINKPTR root2)

...
{
int count,tag;
tag = LinkCount(root1);
count = tag / 2;
while(count--)

...{
InsertLink(root2,LINK_FIRST,DeleteLink(root1,LINK_LAST));
}
return tag;
}
//
合并连接件
void
_MrgLink(LINKPTR root1,LINKPTR root2,LinkSortCall pf,
void
*
parm)

...
{
LINKPTR next1,next2;
LINKPTR plk;
next1 = GetFirstLink(root1);
next2 = GetFirstLink(root2);
while(next1 != NULL && next2 != NULL)

...{
if((*pf)(next1,next2,parm) > 0)

...{
plk = GetNextLink(next2);
InsertLinkBefore(root1,next1,DeleteLink(root2,next2));
next2 = plk;
}else

...{
next1 = GetNextLink(next1);
}
}
while(next2 != NULL)

...{
plk = GetNextLink(next2);
InsertLink(root1,LINK_LAST,DeleteLink(root2,next2));
next2 = plk;
}
}
void
MergeSortLink(LINKPTR root,LinkSortCall pf,
void
*
parm)

...
{
LINK lk;
InitRootLink(&lk);
if(_DivLink(root,&lk) > 1)

...{
MergeSortLink(root,pf,parm);
MergeSortLink(&lk,pf,parm);
_MrgLink(root,&lk,pf,parm);
}
}
collected by barenx