快速排序也是一种分治的递归排序算法,它的原理是通过递归划分元素集合,在每一个集合内选取一个基点,通过比较基点元素和集合内其他元素的值进行位置调整,使得基点左边的元素值均不小于基点值,基点右边的元素值均不大于基点值。
以下的实现中,先分配一个数组空间用于存储连接件集合,空间的大小是链表计数N加2,首位用于存放开始边界(LINK_FIRST),末位存放终止边界(LINK_LAST),数组[1…n]为具体待排连接件,在每一次划分中,如果区间为[m…n],则取m位为基点位,经过调整后,返回基点值的新位置p,下一次划分则分为两个区间[m,p-1]和[p+1,n]。
连接件的值比较通过回调函数实现。
以下的实现中,先分配一个数组空间用于存储连接件集合,空间的大小是链表计数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