博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
合并有序数组的时间复杂度
阅读量:2384 次
发布时间:2019-05-10

本文共 904 字,大约阅读时间需要 3 分钟。

合并已有排序数组的最优和最差情况:

如果是两个数组:

最坏的情况就是交叉的情况:

比如

1  3  5

2  4  6

设上链指针p,下链q,每次比较后较小节点依次作为“合并后链表的节点”,同时较小链指针后移。某链指空后不再比较。则楼上所给的第一个例子:第一步:1和2比,1小作为新节点,p移至3。第二步,3和2比,2小作为新节点,q移至4。第三步,3和4比,3小,p移至5。第四步,5和4比,4小,q移至6。第五步,5和6比,p指空。结束一共比较了5次=3+3-1。

最坏的情况实质上是让两指针都走完各自的链表,同时某链肯定先走完,因为一次只移动一个指针,另一个链表无论怎样都会至少少走一步,这就是m+n-1的含义。(参考:原文:https://blog.csdn.net/zhangvalue/article/details/76735550)

最好的情况就是:

最好情况下:比较次数为 min{m, n}

有个疑问: 若一个数组为 1, 2,3 ; 另一个数组为 4, 5, 6, 7; 则直接将后一个数组最小的与前一个数组最大的比较,仅需一次比较就行了,一定要注意,这是简单归并排序,必须从第一个元素比。

因此,最好情况下,至少需要两两比较一个数组的长度,比较次数为 min{m,n}

(参考:原文:https://blog.csdn.net/robert_chen1988/article/details/78718395)

如果是:

排序时,若不采用计数排序等空间换时间的方法,合并m个长度为n的已排序数组的时间复杂度最优为:

这个时候要用到堆排序:

链接:

合并m个长度为n的已排序数组的时间复杂度为O(nmlogm)

思路是:首先将m个已排序数组的第一个数,建立大小为m的小根堆,时间复杂度O(m)。对于以第一个元素建立起来的小根堆,重建过程需要logm,一共有m个这样的元素所以第一个小根堆完全输出需要的时间复杂度是m*logm(堆排序的时间复杂度logmm包括了初始化的o(m),因为这个只有刚开始的初始化过程需要这么一次),一共需要建立起n个这样的小根堆,所以需要的时间复杂度为logmmn。

你可能感兴趣的文章
慎用VC 6.0
查看>>
游戏杆编程心得
查看>>
周例会的作用
查看>>
字符集研究之多字节字符集和unicode字符集
查看>>
字符集研究之不同字符集的转换方式
查看>>
一个应用程序无法启动错误的解决过程
查看>>
除虫记——有关WindowsAPI文件查找函数的一次压力测试
查看>>
Incredibuild导入key的方式
查看>>
跨平台C++开源代码的两种常用编译方式
查看>>
Eclipse的搜索技巧
查看>>
centos常用命令二
查看>>
通过修改kong属性解决不能获取外网域名的问题
查看>>
Eclipse带命令行参数调试
查看>>
php smtp发送邮件
查看>>
wordpress简代码(短代码、shortcode)
查看>>
yii框架的404、500等异常处理
查看>>
yii框架在layout模式下,模版和layout文件的渲染顺序
查看>>
php5对象复制、clone、浅复制与深复制
查看>>
php设计模式
查看>>
git与github在ubuntu下的使用
查看>>