快速排序也是一種分治的遞迴排序演算法,它的原理是通過遞迴劃分元素集合,在每一個集合內選取一個基點,通過比較基點元素和集合內其他元素的值進行位置調整,使得基點左邊的元素值均不小於基點值,基點右邊的元素值均不大於基點值。
以下的實現中,先分配一個數組空間用於儲存串連件集合,空間的大小是鏈表計數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