采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
在递归实现中,都是在中间进行划分的。 但是在迭代实现中,都是等间距的。如果数据集大小为2^n + 1,那在最后一次归并排序中,左半部分就是2^n,右半部分就是1,此时归并就相当于是插入操作了。我记得老师说自底向上的归并排序会比递归实现慢一点,是否是这个原因呢? 我没有写代码测试,希望老师指点一下,谢谢~
从递归的层数来讲,自顶向下和自底向上是一样的。
比如 9 个元素(2^3 + 1)
用自底向上划分从 1 1 1 1 1 1 1 1 1 (9 个 1)开始
然后归并为 2 2 2 2 1
然后归并为 4 4 1
然后归并为 8 1
然后是 9,总共 5 层
用自顶向下划分,从 9 开始
然后划分为 4 5
然后划分为 2 2 3 2
然后划分为 1 1 1 1 2 1 1 1
然后划分为 1 1 1 1 1 1 1 1 1 ,也是 5 层。
自底向上 有的时候会慢一些的核心原因是,一些归并排序的优化在自底向上的时候没有作用。
比如如果发现左半部分的最大值比右半部分的最小值还要小的时候,那么当前处理的整个部分都可以不再处理了。这就可以大大削减整个归并排序的递归树,但是在自底向上的归并排序的过程中,整棵递归树一定会被遍历到,没有这个削减的空间。
但是这种优化都是常数级,或者对特殊测试数据的优化,并不改变整个归并排序的时间复杂度。而且由于在一些“特殊”的环境下,使用递归是一个性能的 concern(比如嵌入式开发中),所以自底向上的归并排序也是非常有意义的(虽然在这种情况下,使用希尔排序更常见一些。)
继续加油!:)
非常感谢!
为什么在嵌入式开发使用希尔排序比较多呢?我记得您说过希尔排序的时间复杂度是O(n^(3/2))。如果是内存少,不使用递归的写法不就行了吗?
因为实现极度简单,并且在一般的数据规模,速度非常快。即使比归并排序慢一点,也完全在可接受的范围里。时间复杂度只是一个看当数据规模变化的情况下,数据增长趋势的工具,时间复杂度高,不一定性能一定高;时间复杂度差,不一定性能一定差,比如我们在归并优化中,会使用插入排序,就是这个道理。
登录后可查看更多问答,登录/注册
课程专为:短时间内应对面试、升职测评等艰巨任务打造
8.8k 21
5.8k 3
5.0k 5
1.4k 18