基于单链表的快排
来源:互联网 发布:k均值聚类算法matlab 编辑:程序博客网 时间:2024/05/16 18:05
来自:http://blog.sina.com.cn/s/blog_8d2b43b50101c6wk.html
单链表的快排序和数组的快排序基本思想相同,同样是基于划分,但是又有很大的不同:单链表不支持基于下标的访问。但是,由于单链表不能像数组那样随机存储,和数组的快排序相比较,还是有一些需要注意的细节:
1、支点的选取,由于不能随机访问第K个元素,因此每次选择支点时可以取待排序那部分链表的头指针。
2、遍历量表方式,由于不能从单链表的末尾向前遍历,因此使用两个指针分别向前向后遍历的策略实效,
有两种方式实现单链表的快速排序:
第一种是调整节点的next域。选择链表的第一个节点作为基准,然后进行比较,比基准小得节点放入左面的子链表,比基准大的放入右边的子链表。在对待排序链表扫描一遍之后,左面子链表的节点值都小于基准的值,右边子链表的值都大于基准的值,然后把基准插入到链表中,并作为连接两个子链表的桥梁。
Node *Partition(Node **ypBegin, Node *pEnd)
{
}
void
{
}
也可以用一个函数实现递归:
void QuickSortForLinkList(Node **ypHead, Node *pEnd)
{
}
调用方式为:QuickSort(&pHead, NULL), QuickSortForLinkList(&pHead, NULL)
第二种是交换节点的值域。需要两个指针p和q,这两个指针均往next方向移动,移动的过程中保持p之前的key都小于选定的key,p和q之间的key都大于选定的key,那么当q走到末尾的时候便完成了一次枢轴点位置的寻找,进而将枢轴点复制到合适的节点处。具体做法是:
1)定义两个指针pLeft,pRight,其中pLeft指向单链表的头结点,pRight指向单链表头结点的下一个结点;
2)使用pRight遍历单链表,每遇到一个比支点小的元素,就令pLeft=pLeft->pNext,然后和pRight进行数据交换。
// Exchange the node data to quick sort Linklist through two functions
void Swap(int &p, int &q)
{
}
Node* Partition(Node* pBegin, Node* pEnd)
{
}
void QuickSort(Node* pBeign, Node* pEnd)
{
}
一种调用方式(即测试方法):
#include
#include
using namespace std;
struct Node
{
};
void PrintList(Node *pHead)
{
}
void TestListQuick()
{
}
- 基于单链表的快排
- 基于单链表的快排
- 基于单链表的快排实现
- 单链表的快排
- 单链表的快排实现
- 单链表的快排实现
- 基于快排的partition实现TOPK问题
- 基于快排 查找数组中出现三次的元素(***)
- 基于快排的算法面试题partition
- 快排的疑惑?
- 实现的快排
- 陈泽泽的快排
- 快排的本质
- 快排的用法
- 快排的优化
- 未完成的快排
- 快排的思考
- 单链表之快排
- 1119. Pre- and Post-order Traversals
- Joda-Time入门
- leetcode刷题之旅——53. Maximum Subarray
- android自定义Adapter
- 倒计时 小demo
- 基于单链表的快排
- 翻转一个数字(不知其有多少位)
- Web项目中的JSP
- micro SD(TF)卡详解
- Nginx中upstream有以下几种方式:
- TTY总结文档
- (JAVA)LeetCode 1. Two Sum
- 信息安全学习之路 ——— ctf 之 想看正面?那就要看仔细了!
- BZOJ 1026