合并有序数组的时间复杂度

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

如果是两个数组:

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

比如

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的已排序数组的时间复杂度最优为:

这个时候要用到堆排序:

链接:https://www.nowcoder.com/questionTerminal/bae14a768b224a78a6146a6b855d83df?toCommentId=386463
合并m个长度为n的已排序数组的时间复杂度为O(nmlogm)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值