为什么Merge Sort中的合并操作是O(n)?

时间:2012-08-14 07:03:53

标签: mergesort

  

对于合并排序分而治之的操作,自下而上合并阶段需要多长时间?我的导师说它是线性的,因此它将是O(n)。但我没有得到它。它将如何线性?

合并操作如何是线性的O(n)

1 个答案:

答案 0 :(得分:2)

两个数组的合并操作是扫描数组并选择最低/最高的两个数组。

所以你有

a: [1, 3, 6, 7]
b: [4, 5, 7, 8]

你比较像这样(伪代码)

indexA = 0;
indexB = 0;
auxilaryArray = [];
indexAux = 0;

while true 
   if indexA > len(a)-1 or indexb > len(b) -1  
       break
   # you are cherry picking one from the two array which is lesser
   # until any one of these array exausts
   if(a[indexA] > b[indexB])
       auxilaryArray[indexAux++] = b[indexB++]
   else
       auxilaryArray[indexAux++] = a[indexA++]

#append the remaining array 
while indexA < len(a)
    auxilaryArray[indexAux++] = a[indexA++]

#appends the remaining array
while indexB < len(b)
    auxilaryArray[indexAux++] = b[indexB++]

您会看到数组a[k]b[m]三个循环的迭代总和k+m


以防

a: [1, 3, 6, 7]
b: [4, 5, 7, 8]

这是第一个循环:

(0, 0), (1, 0), (2, 0), (2, 1), (2, 2), (3, 2) # 6 iterations; array a exhausted

由于a已被扫描,第二个循环无法运行。

第三个循环追加

b[2], b[3]   # 2 iterations; b exhaused

您看到8 = 4 + 4个循环在运行吗?订单是什么O(n)


在Mergesort中,除法运算是对数的,ln n - 合并部分是线性的。由于您分割和合并后,顺序变为乘法,因此Mergesort为O(nln(n))

与气泡,选择,插入排序不同,您从左向右扫描(O(n))然后通过连续交换(气泡)拟合正确的候选者,或者通过扫描未排序数组的其余部分(选择) ,或者通过在数组的排序部分(插入)中的正确位置插入 - 这些操作是O(n)...所以这些算法的整体顺序变为O(n 2