struct Node
{
int key;
Node* next;
Node(int nKey, Node* pNext)
: key(nKey)
, next(pNext)
{}
};
/*
基准值是start->data;
将原链表看作2个链表:左链表和右链表,左链表最后一个节点就是基准值
p1是左链表的最后一个节点,p2是右链表的最后一个节点
因此,当遇到大于基准值的时候,p2一直右移;
当遇到小于基准值的时候,p1右移一个,再交换p1和p2的值,相当于维持了p1和p2的定义
一轮循环的最后,p2到达了end的位置,此时,应该交换p1和start节点的值,这时才是真正的一轮处理的结束
下一轮,就递归调用 qs(start, p1) 和 qs(p1->next, end) 了。
*/
Node* GetPartion(Node* pBegin, Node* pEnd)
{
int key = pBegin->key;
Node* p = pBegin;
Node* q = p->next;
while(q != pEnd) // p到q之间的值为 大于Key的
{ // q 打头阵呢 比key小的 就要 swap 一下啊
if(q->key < key)
{
p = p->next;
swap(p->key,q->key); // 其思想还是找个key 小于key的在左边,大于key的放到右边
}
q = q->next;
}
swap(p->key,pBegin->key);
return p;
}
void QuickSort(Node* pBeign, Node* pEnd)
{
if(pBeign != pEnd)
{
Node* partion = GetPartion(pBeign,pEnd);
QuickSort(pBeign,partion);
QuickSort(partion->next,pEnd);
}
}