在空间复杂度O(1)的条件下实现归并排序[原创]
来源:互联网 发布:epub转txt软件 编辑:程序博客网 时间:2024/05/02 01:30
第一:对一个L1,L2,的子序列,分别长度为,m,n.可以用min(m,n)的空间协助进行归并排
序,且仅对该额外空间的值得顺序有影响。详细参见sara basse的那本算法书.
第二:对于一个已经排序的L1,L2,总长度假定为u,为了方便分析,假定L1的长度=L2的长度=u/2,切分成sqrt(u)的个
块,每个快有sqrt(u)个数,然后对L1,的最后一块和L2的最后一块归并,L2的最后一
块存放全部数据的最大数据,同时也是利用L2的这个最后一块作为下面归并的额外空间。
第三:对剩余的块(除L2最后一块,那块存放最大元素的那块),按照块的最小元素排序,之后依次归并相邻块。
第四:对最后一块进行排序,因为他作为额外空间,参与了两两相邻的块排序,自己的顺序不能保证,所以最后还要排序一次。
这种方法的正确性可以这样来简单解释
由于最后的分块都是从L1或者L2中切下来的。
那么第i块,第i+1块和第i+2块(如果按照最小元素排序的话)
不妨假定第i块来自L1,第i+1块来自L2。(i,i+1,i+2,是切下来后的编号,例如例子中第1块是1 4 6 15是L1的第一块,第2块2 3 4 16是L2的第1块)
那么i+2块可能来自哪里呢?要么是原L1块在第i块后面,要么是原L2块在i+1块后面的块。也就是第i+1块至少比N个数要大(N为块内数目),换言之i和i+1块归并后的最小块i'块均比i+1块小,这一点是本算法的难点,想明白后,就不难理解了。
因此i和i+1这两块归并后的i‘块的最大元素,一定比i+1块的最小元素要小,因此正确性可以保证。
画个图来举例:
图1 通过对L1和L2的最大块进行归并,用一个4个元素的交换空间,得到L1&L2的最大块22 23 24 25
图2 将归并顺序按照块最小元素的顺序进行归并,并利用交换空间
图3 利用交换空间归并的过程,注意归并后交换空间的数依然是22 23 24 25,但顺序已经变了,因此在归并到最后还需要再排序一次
4 5 6 15 和 16 17 20 21的归并不再图示。
- 在空间复杂度O(1)的条件下实现归并排序[原创]
- 归并排序,空间复杂度O(1)的实现
- 归并排序空间复杂度O(1)的实现
- O(1)空间复杂度的归并排序
- O(1)空间复杂度的归并排序
- 单链表的归并排序:时间复杂度O(nlogn),空间复杂度O(1)
- 百度笔试题之归并排序总结----空间复杂度为O(m+n)的归并排序与空间复杂度为O(1)的归并排序
- 原地归并算法(空间复杂度为O(1)的归并排序)
- 就地归并排序inplacMergeSort,空间复杂度O(1)
- 如何在时间复杂度为O(n),空间复杂度为O(1)的条件下,统计数组中不同元素出现的次数
- 时间复杂度O(n),空间复杂度O(1)的排序
- 手摇算法(三重翻转算法)和空间复杂度为o(1)的归并排序
- 归并排序的空间复杂度为什么是O(n)?快速排序的空间复杂度为什么是O(log2n)?
- 如何实现在O(n)时间内排序,并且空间复杂度为O(1)
- 空间复杂度O(1)的两个有序序列的归并
- 归并排序C实现-空间复杂度O1
- 归并排序及其空间复杂度的思考
- 2012百度暑期实习_空间复杂度为O(1)的排序算法的实现(java)
- 软件测试中的基本词汇 [转]
- 秋香迷醉篇之花有四香 [原]
- 工作心得(9)——引用 [原]
- 说如厕
- 永远到底有多远,在选择之后回首
- 在空间复杂度O(1)的条件下实现归并排序[原创]
- 牛的独白
- AndroMDA Getting started(八)
- 深入研究Spring下的事务
- 现在的小孩真是早熟
- 用javascript来显示HTML控件的位置即javascript文件在ASP.NET中的运用
- 井底蛙
- 创个blog test
- 狗咬屁股