递归合并排序算法

时间:2015-02-25 06:50:10

标签: algorithm sorting merge mergesort

所以我正在研究一个算法问题,而且对于正确答案看起来应该是什么感到困惑。我有一个答案,但如果有人能给我反馈/指导,我会非常感激。

问题:

Casc Merge is a recursive algorithm: Assume there     
are n sorted lists, each of size m. Recursively 
Casc Merge the first n − 1 lists and then
Merge the last list (of size m) into the sorted list A (which is of size (n-1)m).

1)Write down code for it

这是我到目前为止所想到的。看起来好像我正走在正确的轨道上,但就像我说我不知道​​的那样。我试过谷歌搜索并没有得到太多的帮助

proc Cas(A, L, c)
  if c == n then
     Merge(A, L[c-1], L[c])
  end if
  else
     Merge(A, Casc(A, L, c), Casc=(A, L, c+1))
  end else
end proc 

再次,提前感谢您对psuedocode的任何建议/反馈。

假设合并进行m + n - 1次比较

S(n) = { 1                  if c = 1   
         S(n-1) + m - 1     otherwise   
}

1 个答案:

答案 0 :(得分:0)

我觉得你很亲密。但是,当您将c==nL[c-1]合并到L[c]时,看起来您可能会在A基础情况附近进行合并的“双重预订”,但是在之前的通话中,您已经在执行L[c-1]L[c]的合并。

如果您在定义方面考虑递归算法,可以使用稍微简化的逻辑来编写它:

procedure Cascade(List A, List[] L, int c)
   // base case (1-based indexing)
   if (c == 1) then
       Merge(A, L[c], {}) // merge the empty list with L[c] into A
   else
       // use the recursive definition
       Merge(A, L[c], Cascade(A, L, c-1))  // merge L[c] with L[c-1]
   end if
end procedure

您可以调用以下程序:Cascade({}, L, n)

你可以像这样工作:

n = 3
L = {{1 2 3} {3 2 1} {4 5 6}}
A = {}

First call to Merge yields:
Merge(A, {4 5 6}, Cascade({}, {{1 2 3} {3 2 1} {4 5 6}}, 2))

Then:
n = 2
Merge(A, {3 2 1}, Cascade({}, {{1 2 3} {3 2 1} {4 5 6}}, 1))

Then:
n = 1 (base case)
Merge(A, {1 2 3}, {})

Trickling back up the chain (actual merge results not shown for clarity):
A = {1 2 3}
A = {1 2 3 3 2 1}
A = {1 2 3 3 2 1 4 5 6}  // merged list (the actual implementation would have sorted these...)

你已经完成了!希望这可以帮助你...

编辑:基于评论中充实的讨论,以下是使用返回来传递数据而不是就地修改的示例。

procedure Cascade(List[] L, int c)
   // base case (1-based indexing)
   if (c == 1) then
       A = Merge(L[c], {}) // merge the empty list with L[c] into A
   else
       // use the recursive definition
       A = Merge(L[c], Cascade(L, c-1))  // merge L[c] with L[c-1]
   end if
   Return A // return the newly merged list
end procedure