美文网首页程序员
为什么 θ(nlgn) 可以表示归并排序的运行时间

为什么 θ(nlgn) 可以表示归并排序的运行时间

作者: 老邵 | 来源:发表于2018-12-05 21:45 被阅读12次

在排序算法中,有多种不同的算法可以选择,这些算法的最坏情况运行时间一般是不同的。比如插入排序和归并排序相比,插入排序的运行时间是 θ(n^2) 而归并排序的运行时间是 θ(nlgn)。

那么,θ(n*lgn) 为什么可以表示归并排序的运行时间。首先,我们先来简单解释一下 θ 这个符号代表什么。这个符号是一个渐进记号。设 f(n) 是能够代表代码的运行时间的函数,f(n) = θ(g(n)) 就表示 存在正常连 c1、c2 和 n0 ,使得对于所有的 n>= n0,有 0 <= c1*g(n) <= f(n) <= c2*g(n)。也就是说 f(n) 这个函数与 g(n) 这个函数在增长速度上是相等的。

理解了 theta 的概念后,下面来探讨归并排序的运行时间的问题。这里所说的归并排序是将一组数字一分为二、二分为四、四分为八,假设数组有 32 个元素,最终会将这个数组分为 32 份。当数组中的元素无法再分时,这种情况就是基准情况,程序中需要有相关代码对这种情况进行处理。就这样,我们将一个大问题分为多个小问题进行处理后再整合起来。每次问题分割都会分为上一个问题的二分之一。

所以,该算法的时间描述为 T(n) = 2*T(n/2) + c*n 。这里只讨论 n > 1 时的情况,其中 c 为一个常数。要证明 T(n) = θ(n*lgn),我们先来假设有一个足够大的输入 n。

图片.png

观察上图,我们在第一层需要 c*n 的时间,同时第一层会分出两个 T(n/2) 。T(n/2) 的运行时间为 c*n/2,所以第二层的运行时间是 c*n。每个 T(n/2) 都会分出两个 T(n/4),因此第三层为四个 T(n/4) ,运行时间为 4*c*n/4 = c*n。以此类推,直到分为单个元素不能再分,每一层的运行时间都是 c*n。

至于有多少层,因为每层分为上一层元素的二分之一,设 s 为层数,n为元素数量。
n 除以 2^(s-1) 等于 1,n = 2^(s - 1),s - 1 = lgn,s = lgn + 1。总时间为 c*n*s,
即 c*n*lgn + c*n。因为增长量级需要忽略系数以及低阶项,所以 T(n) = c*n*lgn + c*n = θ(n*lgn)。

相关文章

  • 为什么 θ(nlgn) 可以表示归并排序的运行时间

    在排序算法中,有多种不同的算法可以选择,这些算法的最坏情况运行时间一般是不同的。比如插入排序和归并排序相比,插入排...

  • 堆排序(HeapSort)

    与归并排序一样,但不同于插入排序的是,堆排序的时间复杂度是O(nlgn)。而与插入排序相同,但不同于归并排序的是,...

  • 哈希思想的桶排序/计数排序 2020-09-06(未允禁转)

    1.桶排序 之前接触的排序,快排,堆排,归并的时间复杂度O(NlgN),冒泡时间复杂度O(N^2)。而桶排序是时间...

  • 006【算法篇】线性时间排序

    前面我们提到的插入排序、归并排序及快速排序均有个特点,即时间复杂度渐近下界为?(nlgn),哪怕是随机化的快速排序...

  • O(nlgn)时间排序链表

    在O(nlgn)时间里面对链表排序,且使用特定的空间。看到这个时间很容易想到的是快排,堆排,归并排序这几个时间复杂...

  • 面试经验

    1.排序算法。冒泡排序的复杂度是n2,主要考归并排序和快速排序。归并永远是nlgn,快速在每次左右不均的情况下,例...

  • 排序——快排/归并(nlgn)

    快速排序一般是递归实现,但是递归有一个问题就是如果递归太深会导致栈溢出,而大部分的递归实现都有对应的非递归解决方案...

  • 快速排序和归并排序(golang实现)

    快排和归并是使用比较广泛的两种排序算法,他们的性能都可以达到O(nlgn),这也是基于排序的算法能达到的最佳的性能...

  • 常用排序算法之归并排序

    归并排序算法 运行 输出

  • 归并排序

    上述时间复杂度为O(nlgn),空间复杂度为O(n),适用于排序大列表,基于分治法。下列图片来展示长度16数组归并...

网友评论

    本文标题:为什么 θ(nlgn) 可以表示归并排序的运行时间

    本文链接:https://www.haomeiwen.com/subject/peryxqtx.html