📜  DAA-合并排序

📅  最后修改于: 2021-01-12 03:31:58             🧑  作者: Mango


在本章中,我们将讨论合并排序并分析其复杂性。

问题陈述

对数字列表进行排序的问题立即使其适用于分而治之的策略:将列表分为两半,递归地对每一半进行排序,然后合并两个已排序的子列表。

在此算法中,数字存储在数组number []中。在此, pq表示子数组的开始和结束索引。

Algorithm: Merge-Sort (numbers[], p, r) 
if p < r then  
q = ⌊(p + r) / 2⌋ 
Merge-Sort (numbers[], p, q) 
    Merge-Sort (numbers[], q + 1, r) 
    Merge (numbers[], p, q, r) 
Function: Merge (numbers[], p, q, r)
n1 = q – p + 1 
n2 = r – q 
declare leftnums[1…n1 + 1] and rightnums[1…n2 + 1] temporary arrays 
for i = 1 to n1 
   leftnums[i] = numbers[p + i - 1] 
for j = 1 to n2 
   rightnums[j] = numbers[q+ j] 
leftnums[n1 + 1] = ∞ 
rightnums[n2 + 1] = ∞ 
i = 1 
j = 1 
for k = p to r 
   if leftnums[i] ≤ rightnums[j] 
      numbers[k] = leftnums[i] 
      i = i + 1 
   else
      numbers[k] = rightnums[j] 
      j = j + 1 

分析

让我们考虑一下,Merge-Sort的运行时间为T(n) 。因此,

$ T(n)= \ begin {cases} c&if \:n \ leqslant 1 \\ 2 \:x \:T(\ frac {n} {2})+ d \:x \:n&else \ end {cases $$,其中cd是常量

因此,使用此递归关系,

$$ T(n)= 2 ^ i T(\ frac {n} {2 ^ i})+ idn $$

例如,$ i = log \:n,\:T(n)= 2 ^ {log \:n} T(\ frac {n} {2 ^ {log \:n}})+ log \:ndn $

$ = \:cn + dnlog \:n $

因此, $ T(n)= O(n \:log \:n)$

在下面的示例中,我们逐步显示了Merge-Sort算法。首先,将每个迭代数组划分为两个子数组,直到该子数组仅包含一个元素。当这些子阵列无法进一步划分时,将执行合并操作。

例