C++归并法+快速排序实现链表排序的方法

 更新时间:2021年04月20日 09:38:18   作者:秦枫-_-  
这篇文章主要介绍了C++归并法+快速排序实现链表排序的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

本文主要介绍了C++归并法+快速排序实现链表排序的方法,分享给大家,具体如下:

在这里插入图片描述

我们可以试用归并排序解决:
对链表归并排序的过程如下。

找到链表的中点,以中点为分界,将链表拆分成两个子链表。寻找链表的中点可以使用快慢指针的做法,快指针每次移动 2 步,慢指针每次移动 1步,当快指针到达链表末尾时,慢指针指向的链表节点即为链表的中点。

对两个子链表分别排序。

将两个排序后的子链表合并,得到完整的排序后的链表

上述过程可以通过递归实现。递归的终止条件是链表的节点个数小于或等于 1,即当链表为空或者链表只包含 1 个节点时,不需要对链表进行拆分和排序。

class Solution {
public:
    ListNode* sortList(ListNode* head) {
        return sortList(head, nullptr);
    }

    ListNode* mergesort(ListNode* head, ListNode* tail) {
        if (head == nullptr) {
            return head;
        }
        if (head->next == tail) {
            head->next = nullptr;
            return head;
        }
        ListNode* slow = head, * fast = head;
        while (fast != tail) {
            slow = slow->next;
            fast = fast->next;
            if (fast != tail) {
                fast = fast->next;
            }
        }
 
        return merge( mergesort(head, slow),  mergesort(slow, tail));
    }

    ListNode* merge(ListNode* head1, ListNode* head2) {
        ListNode* dummyHead = new ListNode(0);
        ListNode* temp = dummyHead, * temp1 = head1, * temp2 = head2;
        while (temp1 != nullptr && temp2 != nullptr) {
            if (temp1->val <= temp2->val) {
                temp->next = temp1;
                temp1 = temp1->next;
            }
            else {
                temp->next = temp2;
                temp2 = temp2->next;
            }
            temp = temp->next;
        }
        if (temp1 != nullptr) {
            temp->next = temp1;
        }
        else if (temp2 != nullptr) {
            temp->next = temp2;
        }
        return dummyHead->next;
    }
};

快速排序不能随机选取节点,时间复杂度太高所以会超时

class Solution {
    public static ListNode sortList(ListNode head) {
        return quickSort(head ,null);
    }

    public static ListNode quickSort(ListNode head ,ListNode end){
        if(head ==end || head.next ==end) return head;
        ListNode lhead = head ,utail = head ,p = head.next;
        while (p != end){
            ListNode next = p.next;
            if(p.val < head.val){//头插
                p.next = lhead;
                lhead = p;
            }
            else { //尾插
                utail.next = p;
                utail = p;
            }
            p = next;
        }
        utail.next = end;
        ListNode node = quickSort(lhead, head);
        head.next =  quickSort(head.next, end);
        return node;
    }
}


到此这篇关于C++归并法+快速排序实现链表排序的方法的文章就介绍到这了,更多相关C++ 链表排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 用C# 控制Windows系统音量的实现方法

    用C# 控制Windows系统音量的实现方法

    本篇文章是对使用C#控制Windows系统音量的实现方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言快速排序与二分查找算法示例

    C语言快速排序与二分查找算法示例

    这篇文章主要介绍了C语言快速排序与二分查找算法,涉及C语言随机数生成、快速排序及二分查找等算法相关实现技巧,需要的朋友可以参考下
    2018-01-01
  • Qt实现绘制网格背景的示例代码

    Qt实现绘制网格背景的示例代码

    这篇文章主要介绍了Qt如何实现绘制网格背景,并且能实现窗口大小调整时网格背景也自动调整重绘,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-06-06
  • C语言编程之预处理过程与define及条件编译

    C语言编程之预处理过程与define及条件编译

    这篇文章主要为大家介绍了C语言编程之预处理过程与define及条件编译,文中通过图文及示例代码方式作了详细的解释,有需要的朋友可以借鉴参考下
    2021-09-09
  • C语言16进制与ASCII字符相互转换

    C语言16进制与ASCII字符相互转换

    大家好,本篇文章主要讲的是C语言16进制与ASCII字符相互转换,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • C++ BoostAsyncSocket实现异步反弹通信的案例详解

    C++ BoostAsyncSocket实现异步反弹通信的案例详解

    这篇文章主要为大家详细介绍了C++ BoostAsyncSocket如何实现异步反弹通信,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的可以了解一下
    2023-03-03
  • 深入了解C语言的动态内存管理

    深入了解C语言的动态内存管理

    所谓动态和静态就是指内存的分配方式。动态内存是指在堆上分配的内存,而静态内存是指在栈上分配的内存,本文将用5600字带你深入了解动态内存管理,感兴趣的可以学习一下
    2022-07-07
  • C/C++中宏定义(#define)

    C/C++中宏定义(#define)

    #define命令是C语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。接下拉通过本文给大家分享C/C++中宏定义(#define)知识,需要的朋友参考下
    2017-02-02
  • C++读写INI配置文件的类实例

    C++读写INI配置文件的类实例

    这篇文章主要介绍了C++读写INI配置文件的类,实例分析了C++操作ini配置文件的相关技巧,需要的朋友可以参考下
    2015-06-06
  • VC++ loadlibrary()加载三方dll失败, 返回错误码:126的解决方法

    VC++ loadlibrary()加载三方dll失败, 返回错误码:126的解决方法

    今天在编写VC++ loadlibrary()加载三方dll是总是失败,并且返回错误码:126,这里就为大家分享一下具体的解决方法
    2021-03-03

最新评论