合并已有排序数组的最优和最差情况:
如果是两个数组:
最坏的情况就是交叉的情况:
比如
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。