📜  单链表上快速排序的 C++ 程序(1)

📅  最后修改于: 2023-12-03 14:50:29.503000             🧑  作者: Mango

单链表上快速排序的 C++ 程序

本篇文章将介绍如何在C++中对单链表进行快速排序。

快速排序算法

快速排序是一种常用的排序算法,其基本思想是通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,然后分别对这两部分记录继续进行排序,从而达到整个序列有序的目的。

快速排序的核心实现是快速划分,本文将介绍如何通过快速划分对单链表进行快速排序。

单链表的快速排序
快速划分

对于单链表的快速排序,我们需要对单链表进行快速划分。

具体地,我们需要选择链表中一个值作为枢轴元素,然后将链表按照枢轴元素划分成两个链表:第一个链表中的每个元素都小于枢轴元素,而第二个链表中的每个元素都大于等于枢轴元素。最终,我们将这两个链表拼接起来即可。

我们可以通过以下步骤实现快速划分:

  1. 选择链表中的一个元素作为枢轴元素。
  2. 遍历链表,将小于枢轴元素的节点插入到left链表中,将大于等于枢轴元素的节点插入到right链表中。
  3. 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)的时间内完成排序,比其他排序算法的时间复杂度更优秀。