您的位置:首页 > 其它

链表的快速排序(递归,交换节点数据)

2014-07-15 21:51 274 查看
struct ListNode {
int val;
ListNode *next;
ListNode(int x = 0) : val(x), next(NULL) {}
};
void QuickSortCore(ListNode* pBegin, ListNode* pEnd);
ListNode* partition(ListNode* pBegin, ListNode* pEnd);

void QuickSort(ListNode* head)
{
if(head == NULL) return;
QuickSortCore(head,NULL);
}

//排序的范围是[pBegin,pEnd)
void QuickSortCore(ListNode* pBegin, ListNode* pEnd)
{
//递归基,[pBegin,pEnd)为空或只有一个节点
if(pBegin == pEnd || pBegin->next == pEnd) return;

ListNode* pPivot = partition(pBegin,pEnd);
QuickSortCore(pBegin, pPivot);
QuickSortCore(pPivot->next, pEnd);
}

void swap(int& a, int& b)
{
int temp = a;
a = b;
b = temp;
}

ListNode* partition(ListNode* pBegin, ListNode* pEnd)
{
ListNode* pPivot = pBegin;
ListNode* pCursor = pBegin->next;

//以pBegin作为支点来划分链表
for(; pCursor != pEnd; pCursor = pCursor->next)
{
if(pCursor->val > pBegin->val) continue;
else if(pCursor == pPivot->next) pPivot = pPivot->next;
else
{
pPivot = pPivot->next;
swap(pPivot->val, pCursor->val);
}
}

swap(pBegin->val,pPivot->val);
return pPivot;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: