链表快速排序

快速排序也是一种分治的递归排序算法,它的原理是通过递归划分元素集合,在每一个集合内选取一个基点,通过比较基点元素和集合内其他元素的值进行位置调整,使得基点左边的元素值均不小于基点值,基点右边的元素值均不大于基点值。

以下的实现中,先分配一个数组空间用于存储连接件集合,空间的大小是链表计数N加2,首位用于存放开始边界(LINK_FIRST),末位存放终止边界(LINK_LAST),数组[1…n]为具体待排连接件,在每一次划分中,如果区间为[m…n],则取m位为基点位,经过调整后,返回基点值的新位置p,下一次划分则分为两个区间[m,p-1]和[p+1,n]。

       连接件的值比较通过回调函数实现。


 

XDL_API  void  QuickSortLink(LINKPTR root,LinkSortCall pf, void *  parm);

/*

功能:对链表进行快速排序

参数:root为根连接件指针,pf为排序回调函数,param为回调参数

返回:无

*/


// 调整

int  _PartSortLink(LINKPTR *  pa, int  i, int  j,LinkSortCall pf, void *  parm)

{

       LINKPTR 
base,tmp;

       
int n;

 

       
if(i == j)

              
return 0;

 

       n 
= i++;

       
base = pa[n];

       
do{

              
while(pa[i] != LINK_LAST && (*pf)(pa[i],base,parm) < 0)

                     i
++;

 

              
while(pa[j] != LINK_FIRST && (*pf)(pa[j],base,parm) > 0)

                     j
--;

 

              
if(i < j)

              
{

                     tmp 
= pa[i];

                     pa[i] 
= pa[j];

                     pa[j] 
= tmp;

              }


       }
while(i < j);

 

       pa[n]
= pa[j];

       pa[j] 
= base;

 

       
return j;

}


// 划分

void  _QuickSortLink(LINKPTR *  pa, int  i, int  j,LinkSortCall pf, void *  parm)

{

       
int n;

 

       n 
= _PartSortLink(pa,i,j,pf,parm);

       
if(n>i)

              _QuickSortLink(pa,i,n
-1,pf,parm);

       
if(n && n<j)

              _QuickSortLink(pa,n
+1,j,pf,parm);

}


// 快速排序

void  QuickSortLink(LINKPTR root,LinkSortCall pf, void *  parm)

{

       LINKPTR
* pa;

       
int count,i;

 

       
//alloc array for storing link point

       count 
= LinkCount(root);

       pa 
= (LINKPTR*)XdlAlloc(count + 2,sizeof(LINKPTR));

       pa[
0= LINK_FIRST;

       
for(i=1;i<=count;i++)

              pa[i] 
= DeleteLink(root,LINK_FIRST);

       pa[count 
+ 1= LINK_LAST;

       
//sort array

       _QuickSortLink(pa,
1,count,pf,parm);

       

       
//reinsert into link list

       
for(i=1;i<=count;i++)

              InsertLink(root,LINK_LAST,pa[i]);

 

       XdlFree(pa);

}


collected by barenx
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值