链表的快速排序
我对一个链表做了一个快速排序的函数,感觉好像正确了,但是不知道是不是还有BUG 或是效率还有问题谁帮我看看啊,哪里有问题指出下,如果效率不好的话,也只说无妨的。
程序代码:static bool f1(bool (* _p)(_DATA, _DATA), _DATA d1, _DATA d2)
{
return (*_p)(d1, d2);
}
static bool f2(bool (* _p)(_DATA, _DATA), _DATA d1, _DATA d2)
{
return !(*_p)(d1, d2);
}
//LINKLISTC 链表类型,
//head头节点
//length链表节点的数量,也就是链表的长度,不含头结点
//_DATA 链表中数据的类型
//_dy比较两个数据大小的函数,前一个大于后一个返回true
//increase true升序,反之降序
static void Qsort(LINKLISTC head, int length, bool (* _dy)(_DATA, _DATA), bool increase)
{
if(length > 1)//至少有2个节点
{
LINKLISTC leftp = head->_n;
LINKLISTC pos = head->_n;//为分界节点的地址
LINKLISTC now = pos;
LINKLISTC fpos = pos;
int len = 0;
_DATA data = leftp->_d;
bool (*f)(bool (*_p)(_DATA, _DATA), _DATA d1, _DATA d2) = increase ? f1 : f2;
for (int i = 1; i < length; ++i)
{
LINKLISTC nown = now->_n->_n;
if((*f)(_dy, data, now->_n->_d))//比较两个对象的大小。
{
if( pos != now )//交换
{
LINKLISTC ptf = pos->_n, ptb = now->_n, pte; //ptf, ptb分别指向前后要交换数据的两个节点
pos->_n = ptb;
now->_n = ptf;
pte = ptb->_n;
ptb->_n = ptf->_n;
ptf->_n = pte;
}
fpos = pos;
pos = pos -> _n;
++len;
if(nown == now->_n)
continue;
}
now = now -> _n;
}//大小区交换完毕
if(pos != leftp)//更换大小区界限元素
{
LINKLISTC ppn;
head->_n = pos;
fpos->_n = leftp;
ppn = pos->_n;
pos->_n = leftp->_n;
leftp->_n = ppn;
}
Qsort(head, len, _dy, increase);
Qsort(leftp, length - len - 1, _dy, increase);
}
}








