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

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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值