详解C++实现链表的排序算法

详解C++实现链表的排序算法

算法介绍

链表是一种常见的数据结构,在实际使用中常常需要对链表进行排序。本文将介绍在C++中实现链表排序的几种算法,包括插入排序,归并排序和快速排序。

插入排序

插入排序(Insertion Sort)是一种简单直观的排序算法。具体实现过程如下:

  1. 遍历链表,取下一个节点作为插入节点。
  2. 如果当前节点不小于插入节点,则将插入节点插入到当前节点之前。
  3. 如果已经到达链表尾部,则将插入节点插入到链表尾部。

该算法的时间复杂度为O(n^2),其中被比较的元素的数量为n(n-1)/2。算法的空间复杂度为O(1)。

归并排序

归并排序(Merge Sort)是一种分治算法,其具体实现过程如下:

  1. 递归划分链表,直到链表只剩下一个节点。
  2. 将两个已排序的链表合并成一个链表。

该算法的时间复杂度为O(nlogn),空间复杂度为O(n)。

快速排序

快速排序(Quick Sort)是一种基于比较的排序算法,其具体实现过程如下:

  1. 选择枢纽,将链表中所有元素分为两部分,一部分小于等于枢纽,另一部分大于枢纽。
  2. 递归排序两个子序列。

该算法的时间复杂度最好为O(nlogn),最坏为O(n^2),平均为O(nlogn)。空间复杂度为O(logn)。

代码示例

以下是三种排序算法的C++代码示例:

插入排序

void insertionSort(ListNode* head) {
    if (!head || !head->next) {
        return;
    }
    ListNode* p = head->next, *q, *r;
    head->next = nullptr;
    while (p) {
        q = p->next;
        r = head;
        while (r->next && r->next->val < p->val) {
            r = r->next;
        }
        p->next = r->next;
        r->next = p;
        p = q;
    }
}

归并排序

ListNode* mergeSort(ListNode* head) {
    if (!head || !head->next) {
        return head;
    }
    ListNode* p = head, *q = head->next;
    while (q && q->next) {
        p = p->next;
        q = q->next->next;
    }
    ListNode* right = mergeSort(p->next);
    p->next = nullptr;
    ListNode* left = mergeSort(head);
    return merge(left, right);
}

ListNode* merge(ListNode* l1, ListNode* l2) {
    if (!l1) {
        return l2;
    }
    if (!l2) {
        return l1;
    }
    if (l1->val < l2->val) {
        l1->next = merge(l1->next, l2);
        return l1;
    } else {
        l2->next = merge(l1, l2->next);
        return l2;
    }
}

快速排序

ListNode* quickSort(ListNode* head) {
    if (!head || !head->next) {
        return head;
    }
    ListNode* p = head->next, *q = head;
    while (p) {
        if (p->val < head->val) {
            q = q->next;
            std::swap(q->val, p->val);
        }
        p = p->next;
    }
    std::swap(q->val, head->val);
    q->next = quickSort(q->next);
    head = quickSort(head);
    return head;
}

示例说明

假设有一个链表[5,3,7,2,9],我们可以使用以下代码对其进行排序:

ListNode* head = new ListNode(5);
head->next = new ListNode(3);
head->next->next = new ListNode(7);
head->next->next->next = new ListNode(2);
head->next->next->next->next = new ListNode(9);
// 使用插入排序进行排序
insertionSort(head);
// 使用归并排序进行排序
head = mergeSort(head);
// 使用快速排序进行排序
head = quickSort(head);

以上示例演示了如何在C++中使用插入排序、归并排序和快速排序对链表进行排序。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解C++实现链表的排序算法 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • PHP大转盘中奖概率算法实例

    下面是一份完整的攻略,讲解如何实现一个PHP大转盘中奖概率算法: 问题描述 如何实现一个PHP大转盘中奖概率算法?也即,在一个转盘上设置几个奖项,每个奖项有对应的中奖概率,随机抽取中奖项并输出对应的奖品。 思路分析 为了实现大转盘的中奖概率算法,需要从以下几个方面入手: 定义奖项:确定奖品数量和对应的中奖概率 生成随机数:使用PHP的rand()函数生成随机…

    算法与数据结构 2023年5月19日
    00
  • JS中数据结构与算法—排序算法(Sort Algorithm)实例详解

    以下是关于“JS中数据结构与算法—排序算法(Sort Algorithm)实例详解”的完整攻略。 简介 数学中有一种重要的问题是如何将一组数据按照一定的规则有序排列。排序算法(Sort Algorithm)就是解决这种问题的一种算法。 在JS中,包含了许多排序算法的实现,包括:冒泡排序、选择排序、插入排序、快速排序、归并排序等。了解和掌握这些算法,有助于…

    算法与数据结构 2023年5月19日
    00
  • 希尔排序算法的C语言实现示例

    下面是“希尔排序算法的C语言实现示例”完整攻略。 希尔排序算法简介 希尔排序是通过将整个待排序数组分割成多个子序列,对每个子序列进行插入排序,然后逐步减少子序列长度,最终使整个序列有序的一种算法。 希尔排序算法的流程 按照一定的间隔将待排序数组分成若干个子序列; 对每个子序列进行插入排序,使其中的元素可以快速有序; 缩小排序间隔,重复执行步骤1和2; 直至排…

    算法与数据结构 2023年5月19日
    00
  • python递归实现快速排序

    Python递归实现快速排序 快速排序是一种常用的排序算法,递归是快速排序算法的重要部分。 快速排序算法步骤 选择一个基准数(pivot)。 将待排序数组分成左右两个子数组,小于等于基准数的元素放在左边,大于基准数的元素放在右边。 递归地对左右两个子数组进行上述排序过程。 Python代码实现 def quick_sort(arr): if len(arr)…

    算法与数据结构 2023年5月19日
    00
  • c# 冒泡排序算法(Bubble Sort) 附实例代码

    冒泡排序算法(Bubble Sort) 冒泡排序算法是比较简单的排序算法之一,它通过多次比较和交换相邻两个元素的位置,将整个序列逐步变得有序,因此也被称为“泡沫排序”。 算法步骤: 从序列的第一个元素开始,与第二个元素进行比较,如果第一个元素大于第二个元素,则交换这两个元素; 接着再与第三个元素进行比较,如果第二个元素大于第三个元素,则交换这两个元素; 以此…

    算法与数据结构 2023年5月19日
    00
  • C语言 奇偶排序算法详解及实例代码

    C语言奇偶排序算法详解及实例代码 本篇文章将详细讲解C语言中奇偶排序算法的原理、实现方法及具体的实例代码,并通过两个示例说明其使用方法。 原理介绍 奇偶排序算法又叫交替排序算法,是一种简单但较慢的排序算法,通常用于小型数据集中的排序。该算法通过使用两个线程分别对奇数位置和偶数位置的元素进行比较和交换来实现排序。 该算法的原理如下: 从头到尾扫描一遍待排序数组…

    算法与数据结构 2023年5月19日
    00
  • js实现简单排列组合的方法

    下面是详细讲解 “js实现简单排列组合的方法” 的攻略。 排列组合的概念 排列就是由给定的n个元素中取出m(m ≤ n)个元素的所有排列总数的不同的排列数,用A(n, m)表示。例如,有3个元素A、B、C,则它们的排列有:ABC、ACB、BAC、BCA、CAB、CBA,共6种排列。 组合是指从n个不同元素中,取出m(m≤n)个元素的所有组合情况,用C(n,m…

    算法与数据结构 2023年5月19日
    00
  • JavaScript实现基础排序算法的示例详解

    JavaScript实现基础排序算法的示例详解 排序算法可以说是计算机科学中最基础的算法之一。而对于前端开发者来说,掌握一些简单的排序算法是很有必要的,因为它们可以帮助我们解决很多实际问题,如搜索结果排序、排名等。在这里,我们将讲解JavaScript如何实现基础排序算法。 冒泡排序 冒泡排序是最简单的排序算法之一。它将数组中的元素两两比较,如果顺序不正确就…

    算法与数据结构 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部