链表的快速排序(递归,交换节点数据)
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; }
相关文章推荐
- leetcode-24,交换链表相邻节点,递归实现
- 删除链表中所有符合要求的数据节点问题
- 交换链表的奇数节点和偶数节点
- 双链表练习--交换节点
- 设计一个整型链表类list,能够实现链表节点的插入、删除、以及链表数据的输出操作。
- Swap Nodes in Pairs 链表两两交换节点@LeetCode
- 数据结构基础 - 链表内节点的删除
- 单向链表小练习--》创建链表头,添加删除链表节点,释放链表内存,选择插入数据
- 某公司面试题,用递归求单链表中值最大的节点
- (10.28)递归建立一个二叉树,交换左右节点,并遍历
- ORACLE 树形结构数据 查询某结点下全部子节点无限递归的前2个数据
- 带头节点链表的反转 循环和递归 C#实现
- 【学习点滴-数据结构-单链表】交换单链表中任意两个元素
- [小算法] 交换链表中的两个节点
- 用递归求单链表中值最大的节点
- 操作链表,需要记住保存前一个结点,以及记录下一个节点,否则容易进入死循环,或者数据出错。
- ext TreePanel 一次递归加载数据及异步加载数据(点子节点加载数据)
- 程序员面试宝典之数据结构基础---⑤单链表逆序的递归与非递归实现
- java中链表的数据(对象)位置交换
- 输出链表倒数第n个节点数据