算法学习 - 链表之归并排序_O(1)空间_O(NlogN)时间_C++
来源:互联网 发布:miss淘宝店外设店 编辑:程序博客网 时间:2024/06/05 03:32
归并排序
归并排序我在之前已经讲过了,并且给了在数组的数列的情况下的归并排序方法,而排序的时间复杂度为O(NlogN).想看的话链接如下:
归并排序,快排,冒泡排序
但是这个归并排序有一个缺点:需要O(n)的额外空间。
那么这个缺点在什么情况下会解决呢?就是数列是以链表形式存储的时候!就不需要额外的申请O(n)级别的空间。
那么我们为什么要用归并排序呢? 不是还有快排,堆排么?都是速度很快的排序。其实在链表中是不适合的!因为在快排的时候,查找标杆是O(1)级别的,但是在链表中只能得到head节点,得到标杆需要O(n)级别的。那么复杂度就上升到(nnlogn)级别的了。
代码实现
所以在链表的情况下需要使用归并排序,复杂度NlogN, 而且不需要申请额外空间。
//// main.cpp// MergeList//// Created by Alps on 14/12/6.// Copyright (c) 2014年 chen. All rights reserved.//#include <iostream>using namespace std;struct ListNode{ int val; ListNode* next; ListNode(int x):val(x),next(NULL){}};class Solution{public: ListNode *sortList(ListNode* head){ if (head == NULL || head->next == NULL) { return head; } ListNode* mid = getMid(head); ListNode* right = NULL; if (mid != NULL) { right = mid->next; mid->next = NULL; } head = sortList(head); right = sortList(right); head = MergeList(head, right); return head; } ListNode* getMid(ListNode* node){ if (node == NULL || node->next == NULL) { return node; } ListNode* l1 = node; ListNode* l2 = node->next; while (l2 && l2->next) { l1 = l1->next; l2 = l2->next->next; } return l1; } ListNode* MergeList(ListNode* left, ListNode* right){ if (left == NULL) { return right; } if (right == NULL) { return left; } ListNode* temp = NULL; if (left->val >= right->val) { temp = right->next; right->next = left; left = right; right = temp; } left->next = MergeList(left->next, right); return left; }};int main(int argc, const char * argv[]) { Solution sl; ListNode *head = new ListNode(4); head->next = new ListNode(2); head->next->next = new ListNode(1); head->next->next->next = new ListNode(3); sl.sortList(head); return 0;}
1 0
- 算法学习 - 链表之归并排序_O(1)空间_O(NlogN)时间_C++
- ?(>_o)!
- 算法系列_基础01_O(nlogn)的理解
- 黑马程序员_O‘Reilly java nio学习笔记之缓冲区1
- 黑马程序员_O‘Reilly java nio学习笔记之选择器
- ZOJ3775:?(>_o)!
- ZOJ3775 ?(>_o)!
- ZOJ3775 ?(>_o)!
- ZOJ3775-?(>_o)!
- 单链表的归并排序:时间复杂度O(nlogn),空间复杂度O(1)
- 黑马程序员_O‘Reilly java nio学习笔记之缓冲区2
- 黑马程序员_O‘Reilly java nio学习笔记之通道_通道基础&& Scatter/Gather
- 黑马程序员_O‘Reilly java nio学习笔记之通道_文件通道
- 黑马程序员_O‘Reilly java nio学习笔记之通道_socket通道
- 黑马程序员_O‘Reilly java nio学习笔记之通道_管道&&Channels工具类
- 黑马程序员_O‘Reilly java nio学习笔记之选择器_通过一个程序初识选择器
- 对链表排序,时间开销O(nlogn), 空间开销O(1)
- nlogn级别的排序算法(1)归并排序
- [kaggle竞赛实践] Titanic幸存预测问题--logistic回归解决方案
- Storm问题——组件带参数构造函数未被调用,抛出NullpointerException
- 矩阵线性无关的特征向量个数与矩阵的秩的关系
- 复数
- A. Marks
- 算法学习 - 链表之归并排序_O(1)空间_O(NlogN)时间_C++
- LINUX修改IP地址
- XML的简单读取与写入
- php xhprof 扩展的使用
- linux中pip安装步骤与使用详解
- java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostExce
- PreferenceActivity里自定义标题栏(title bar)出错:requestFeature() must be called before ad
- VB批处理后重定向输出
- oracle无法删除当前已连接的用户