链表排序(冒泡、归并)

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

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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值