快速排序也是一种分治的递归排序算法,它的原理是通过递归划分元素集合,在每一个集合内选取一个基点,通过比较基点元素和集合内其他元素的值进行位置调整,使得基点左边的元素值均不小于基点值,基点右边的元素值均不大于基点值。
以下的实现中,先分配一个数组空间用于存储连接件集合,空间的大小是链表计数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