题:归并排序最坏情况下时间复杂度为:O(nlog2n)

3.堆、快速排序、归并排序,比较这三种排序算法的时间复杂度和空间复杂度。(不同条件选那个)
答案:
- 若从存储空间考虑,则应该首先选取堆排序法,其空间复杂度为o(1),其次快速排序法,其空间复杂度为O(logn)。
- 若仅从平均情况下排序最快这一点考虑,则应该选取快速排序法。
- 当元素有序时此时快速排序退化为冒泡排序这时候它的的时间复杂度为o(n')在三者中最慢此时不宜选择快速排序

快速排序
快速排序的时间复杂度介于O(nlogn)和O(n^2)之间,不太稳定;快速排序没有申请额外空间,其空间复杂度为 O(1)。
归并排序
归并排序的时间复杂度为O(nlogn),比较稳定;但是归并排序的空间复杂度消耗比较大,为 O(nlogn)。如果是链表结构则是O(n)的空间复杂度,但是链表每个节点都是一份独立空间,实际消耗内存为一个内存页,即4kb。
归并排序的链表方式和数组方式
如果归并排序是链式结构,每个节点都是一个有序数组,然后两两合并,最终的空间复杂度为O(n)。但是每个节点都是单独独立存在的,实际消耗的是一个内存页,n个节点就是n个内存页,链表从一开始所有的节点都必须独立,就存在了n个内存页,并且对内存的消耗是从头到尾一直都是不变的。数组一开始也是一个个独立的,也是以内存页为单位进行消耗,但是在java中,数组一旦不使用了,就会被内存回收掉,在数组合并后原来的数组就会被回收,进行压缩,空间逐步在降低,最终形成一个整数组,消耗很少的内存页。
在归并排序中,对程序进行优化后(即先进行递归,再申请空间)就能实现用多少数据拆多少数组,归并排序是递归调用的方式,在栈底下的方法还没有申请空间时就调用了其本身,如此循环只有栈顶的方法正在运行,成功申请了空间,然后进行排序合并之后,将原本的空间回收了,再执行下面一层的方法,因此可以保证内存中同时存在的数组量一直都很低,实时的空间复杂度就很低。
所以当数据量小的时候用链表快一点,数据量大的时候用数组快一点。
堆排序
堆排序的时间复杂度为O(nlogn);堆排序的空间复杂度为O(1)。
所以从时间复杂度和空间复杂度综合来看,堆排序是比较完美的一种排序方式。像百度这种容易出几亿数据的超大规模计算,都使用堆排序。
2290

被折叠的 条评论
为什么被折叠?



