为什么每次迭代都采用与合并排序完全相同的O(n) 有人可以详细解释一下吗? 为什么C_merge(n)= O(n)?它是指合并两个排序数组的时间。
答案 0 :(得分:0)
我们的想法是我们有两个排序的数组,而不是两个数组,其中一个数组的最小元素大于另一个最高元素。我的意思是,它不是[1, 3, 9, 12]
和[13, 17, 19]
。但它更像[3, 12, 13, 17]
和[1, 9, 19]
。
你看,在以后的情况下你不能追加它们。那么,你如何结合?您遵循以下算法:
m
个元素,第二个元素有n
。您创建一个大小为m+n
的辅助数组。这将存储最终的组合和排序数组。i
和j
,指向阵列的头部。i
和j
的元素;选择较小的一个。复制值辅助数组,并将光标向前移动较小的光标。因此,在我们的例子中,您比较(3, [1]); ([3], 9); (12, [9]); ([12], 19); ([13], 19); ([17], 19); (--, [19])
。你看?怎么比较? (m+n)
。假设每个操作O(1)
。长度为(m+n)
的数组的合并过程为O(m+n)
。
在最好的情况下,您将排序数组作为输入。在这种情况下,要合并的两个子阵列都只需要加入。但是我们将应用上面提到的通用算法。在这种情况下,您必须比较和复制min(m,n)
元素;然后将max(m,n)
元素复制到辅助数组。无论如何,您将进行总计(m+n)
次操作。