实现时间复杂度为O(nlogn)的链表排序算法
来源:互联网 发布:对人工智能的看法400字 编辑:程序博客网 时间:2024/05/20 18:20
简介
链表排序是一道常见的关于链表的算法题,往往我们会使用冒泡排序或者选择排序这两种算法来解决这个问题。但是它们的时间复杂度是O(n²),效率不高。所以今天我们要实现时间复杂度O(nlogn)的算法就不能再选择这两种排序算法。而满足这个时间复杂度的排序算法只有快速排序,堆排序和归并排序。但是因为快排和堆排是不稳定的,所以我选择了归并排序算法来实现链表排序问题。
关于归并排序我以前写过一篇博客,里面介绍了它的算法思想:http://blog.csdn.net/mbuger/article/details/65451607
下面给出代码实现
class ListNode {//结构定义public: int val; ListNode *next; ListNode(int val) { this->val = val; this->next = NULL; } };ListNode* SortList(ListNode* head){ if (head == NULL || head->next == NULL) return head; ListNode* fast; ListNode* slow; while (fast->next != NULL && fast->next->next != NULL) {//通过快慢指针法寻找中间结点 fast = fast->next; fast = fast->next; slow = slow->next; } ListNode* mid = slow->next; slow->next == NULL;//把链表拆分开为两个链表 //分治思想,递归 ListNode* list1 = SortList(head); ListNode* list2 = SortList(mid); ListNode* sorted = Merge(list1, list2); return sorted;}ListNode* Merge(ListNode* list1, ListNode* list2){//合并 if (list1 == NULL) return list2; if (list2 == NULL) return list1; ListNode* head; ListNode* tmp; if (list1->val < list2->val) { head = list1; list1 = list1->next; } else { head = list2; list2 = list2->next; } tmp = head; while (list1 && list2) { if (list1->val < list2->val) { tmp->next = list1; tmp = tmp->next; list1 = list1->next; } else { tmp->next = list2; tmp = tmp->next; list2 = list2->next; } } if (list1 == NULL) { tmp->next = list2; } if (list2 == NULL) { tmp->next = list1; } return head;}
0 0
- 实现时间复杂度为O(nlogn)的链表排序算法
- leetcode之时间复杂度为O(nlogn)的链表排序
- O(nlogn)时间复杂度 链表排序
- 对链表排序 要求时间 复杂度为 O(nlogn) 空间复杂度为常量
- 关于快速排序和插入排序最坏时间复杂度为O(nlogn)的算法
- Java-时间复杂度为O(nlogn)的排序算法(快速排序, 归并排序, 堆排序, 希尔排序)
- 排序的最低时间复杂度为什么是O(nlogn)
- 快速排序算法的时间复杂度为什么是O(NlogN),还有O(N^2)
- 实现排序算法,时间复杂度为O(n)
- LeetCode 148. Sort List--O(nlogn)时间复杂度和常数空间复杂度给链表排序
- 时间复杂度为O(n)的排序算法--计数算法
- 堆排序复杂度为O(nlogn),需要注意的误区
- 二、排序(时间复杂度 O(nlogn))
- 归并排序平均时间复杂度O(NlogN)
- 快速排序[平均时间复杂度O(NlogN)]
- 时间复杂度为O(N),空间复杂度为O(1)的排序算法
- 时间复杂度为O(n)的排序算法
- 时间复杂度为o(1)的排序算法
- 数据库优化方案
- js入门(8)-window对象
- 替换空格
- leetcode 506. Relative Ranks(easy)
- Lottie- 让Android动画实现更简单
- 实现时间复杂度为O(nlogn)的链表排序算法
- 记录一次spring+dubbo下的框架单元测试和所遇到的坑
- ARMv8 與 Linux的新手筆記
- 0 《 C++ Primer Plus(第五版)》学习
- Python 标准库简介concurrent.futures
- oracle命令杂记
- 如何定位死循环或高CPU使用率(linux)
- 编译安装hadoop
- 鼠标滚轮事件