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