我在快排面面观(1),快排面面观(2)分别写了快速排序的基本概念和快排的优化,有兴趣的同学可以先看前两篇之后再来看这一篇。
单链表是链式结构,元素和元素之间通过指针连接,所以链表的排序我们也可以参考数组的快速排序,可以参靠第二篇文章中的单向排序,代码如下,单链表是带头节点的单链表,设置两个变量指向头节点和头节点的下一个节点,头节点不存值。
typedef struct LinkNode
{
int val;
LinkNode* next;
}LinkNode, *LinkList;
LinkList buynode()//购买节点
{
LinkList p = (LinkNode*)malloc(sizeof(LinkNode));
p->val = 0;
p->next = nullptr;
return p;
}
LinkList Init()
{
LinkList s = buynode();
return s;
}
void push_head(LinkList plist)
{
for (int i = 1; i <= 10; i++)
{
LinkList s = buynode();
s->val = i;
s->next = plist->next;
plist->next = s;
}
}
void push_tail(LinkList plist)
{
LinkList p = plist;
for (int i = 1; i <= 10; i++)
{
LinkList s = buynode();
s->val = rand() % 10 + 1;
s->next = p->next;
p->next = s;
p = s;
}
}
void print_list(LinkList head)
{
LinkList p = head->next;//带头结点
while (p != NULL)
{
cout << p->val << " ";
p = p->next;
}
cout << endl;
}
LinkList OnePosition(LinkList first, LinkList end)
{
LinkList ip = first->next;
LinkList jp = first;
int tmp = ip->val;
while (ip != end)
{
if (ip->val <= tmp)
{
jp = jp->next;
swap(jp->val, ip->val);
}
ip = ip->next;
}
swap(first->next->val, jp->val);
return jp;
}
void QuickSort(LinkList first, LinkList end)
{
if (first->next != end)
{
LinkList pos = OnePosition(first, end);
QuickSort(first, pos);
QuickSort(pos, end);
}
}
void Quick(LinkList head)
{
assert(head != nullptr);
QuickSort(head, nullptr);
}
int main()
{
LinkList head;
head = Init();//初始化
push_tail(head);
print_list(head);
Quick(head);
print_list(head);
return 0;
}