📅  最后修改于: 2023-12-03 14:50:29.503000             🧑  作者: Mango
本篇文章将介绍如何在C++中对单链表进行快速排序。
快速排序是一种常用的排序算法,其基本思想是通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,然后分别对这两部分记录继续进行排序,从而达到整个序列有序的目的。
快速排序的核心实现是快速划分,本文将介绍如何通过快速划分对单链表进行快速排序。
对于单链表的快速排序,我们需要对单链表进行快速划分。
具体地,我们需要选择链表中一个值作为枢轴元素,然后将链表按照枢轴元素划分成两个链表:第一个链表中的每个元素都小于枢轴元素,而第二个链表中的每个元素都大于等于枢轴元素。最终,我们将这两个链表拼接起来即可。
我们可以通过以下步骤实现快速划分:
left
链表中,将大于等于枢轴元素的节点插入到right
链表中。left
链表和right
链表拼接起来,并返回头节点。以下是单链表快速划分的C++代码:
ListNode* partition(ListNode* head) {
if (head == nullptr || head->next == nullptr) return head;
ListNode* pivot = head;
ListNode* left = new ListNode(-1);
ListNode* right = new ListNode(-1);
ListNode* l = left;
ListNode* r = right;
ListNode* cur = head->next;
while (cur != nullptr) {
if (cur->val < pivot->val) {
l->next = cur;
l = l->next;
} else {
r->next = cur;
r = r->next;
}
cur = cur->next;
}
l->next = nullptr;
r->next = nullptr;
left = partition(left->next);
right = partition(right->next);
pivot->next = right;
l = left;
while (l->next != nullptr) {
l = l->next;
}
l->next = pivot;
return left;
}
有了快速划分的函数,我们可以通过递归的方式对单链表进行快速排序了。
具体地,我们使用递归的方式对链表分别进行快速排序,最终对左、右两个链表进行拼接即可。
以下是单链表排序的C++代码实现:
ListNode* sortList(ListNode* head) {
if (head == nullptr || head->next == nullptr) return head;
ListNode* new_head = partition(head);
ListNode* p = new_head;
while (p->next != nullptr) {
p = p->next;
}
return new_head;
}
以上便是单链表上快速排序的C++程序实现。
本篇文章介绍了如何在C++中对单链表进行快速排序。具体地,我们使用快速划分的方式实现了单链表的快速排序,并给出了C++程序实现。
快速排序是一种高效的排序算法,能够在O(nlogn)的时间内完成排序。对于单链表,使用快速排序算法能够在O(nlogn)的时间内完成排序,比其他排序算法的时间复杂度更优秀。