归并排序的时间复杂度O(n*log n)是怎么得来的,求大神详细的讲解一下

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了归并排序的时间复杂度O(n*log n)是怎么得来的,求大神详细的讲解一下相关的知识,希望对你有一定的参考价值。

首先你说归并排序最坏的情形为O(NlogN),这是不正确的归并排序如果不借助辅助空间的话,复杂度为O(n^2),借助的话就是O(nlogn)(O(nlog2n))归并排序 平均复杂度是 O(nlogn) 比较快
快速排序快速排序的最坏情况基于每次划分对主元的选择。基本的快速排序选取第一个元素作为主元。这样在数组已经有序的情况下,每次划分将得到最坏的结果。一种比较常见的优化方法是随机化算法,即随机选取一个元素作为主元。这种情况下虽然最坏情况仍然是O(n^2),但最坏情况不再依赖于输入数据,而是由于随机函数取值不佳。实际上,随机化快速排序得到理论最坏情况的可能性仅为1/(2^n)。所以随机化快速排序可以对于绝大多数输入数据达到O(nlogn)的期望时间复杂度。一位前辈做出了一个精辟的总结:“随机化快速排序可以满足一个人一辈子的人品需求。”
随机化快速排序的唯一缺点在于,一旦输入数据中有很多的相同数据,随机化的效果将直接减弱。对于极限情况,即对于n个相同的数排序,随机化快速排序的时间复杂度将毫无疑问的降低到O(n^2)。解决方法是用一种方法进行扫描,使没有交换的情况下主元保留在原位置。
综合来说快速排序速度最快,时间复杂度最小。希望对你有所帮助!追问

我问的是归并排序

参考技术A 首先,你要理解两个长度为n/2的的数组做归并,这个时间复杂度是O(n)。
然后,因为归并排序要不断的把原来数组分成两份,这个递归的过程是O(logn)。比如说你想要排序的数组长度为8,然后不断一的一分为二,就是8——>4——>2——>1。一共拆了3次,2^3 = 8,或者3是以二为底的8的对数。log就是这样来的。
然后两个再相乘,时间复杂度了就是O(nlogn)了。

再谈排序与图论算法

排序

1.主存能放下的数据进行排序称为内部排序,反之称为外部排序(磁盘上)。
2.任何进行交换相邻元素进行排序的算法均需要O(N2)的复杂度,任何进行比较的排序算法至少需要O(N*log(N))的算法复杂度。
3.堆排序和归并排序的时间复杂度平均和最坏均为O(N*log(N))
4.Java中执行一次对象比较是比较昂贵的,移动则是相对节省的,因此归并排序是java的默认泛型排序算法。C++中默认的是快速排序,比较耗费小;快排对于基本类型均具有最快速度。快速排序选取枢纽元的时候采用三数取中,切勿采用首元素。
 
5.桶排序:排序的数小于整数M,实例化一个M维的数组初值为0,依次加入桶,再倒回去。
6.基数排序:排序数组有n 个元素,实例化一个包含10个list的数组(相当于n个桶0123456789),依次从个位数到最高位把n个数放入桶中然后再倒回原数组,每次要清空list。
适合字符串的排序。
 
图论算法
1.定义:
(1)图由顶点和边组成G=(V,E),分为有向图和无向图;边可以有一定权重,边也称为度。有向无圈图也称为DAG。
(2)图是稠密的考虑用邻接矩阵表示O(V2);稀疏图一般用邻接表表示O(E+V)。
 
2.拓扑排序:是对有向无圈图的一种排序方式,使得如果存在一条从vi到vj的路径,那么在排序中vj就出现在vi的后面。(先找出没有入边的顶点)
 
3最短路径算法:
单源最短路径问题:给定顶点,到任意其他顶点的最短距离的算法O(V+E):(即为广度优先搜索breadth-first search)

 

以上是关于归并排序的时间复杂度O(n*log n)是怎么得来的,求大神详细的讲解一下的主要内容,如果未能解决你的问题,请参考以下文章

排序算法的实现(归并,快排,堆排,希尔排序 O(N*log(N)))

归并排序

常见算法

几种排序算法

排序---内部排序算法(快排希尔排序归并排序基数排序冒泡选择排序)比较

几种能在O(n*log(n))时间排序