如何实现从0开始的合并排序?

时间:2014-07-30 10:28:16

标签: c# algorithm

我正在阅读算法简介 - 第三版,我陷入了合并排序问题。我想在C#上实现该算法。正如我们所知道的,或许没有,没关系,书中的结构是由第一个索引1(不是我们预期的0)描述的。本书中提供了以下代码:

  Merge(A, p, q, r)
n1 = q - r + 1;
n2 = r - q
let L[1..n1 + 1] and R[1..n2 + 1] be new arrays
**for** i = 1 **to** n1
    L[i] = A[p + i - 1]
**for** j = 1 **to** n2
    R[j] = A[q + j]
L[n1 + 1] = infinity
R[n2 + 2] = infinity
i = 1
j = 1
**for** k = p **to** r
    **if** L[i] <= R[j]
              A[k] = L[i]
              i++
    **else** A[k] = R[j]
              j++

我真的很困惑所有这些哨兵和东西,但最重要的问题是:如果我们得到的情况,当我们的p(startIndex)等于0,那么下面发生了什么。当我们填充左数组L []时,在第一次迭代(i = 0)时,我们正在接收IndexOutOfRangeException,因为L[0] = A[0 + 0 - 1]。当你的起始指数是0时,是否有人可以解释我的解决方案?

1 个答案:

答案 0 :(得分:0)

您可以系统地转换您的计划。

假设这个虚拟代码:

let A[1..N], B[1..M]
for i= 1 to N
    for j= i to M
        A[i]= B[j]

-1之前使用]转移所有数组访问:

let A[0..N-1], B[0..M-1]
for i= 1 to N
    for j= i to M
        A[i-1]= B[j-1]

如果你愿意,你可以在这里停下来。您还可以移动索引变量,盲目地将k替换为k+1

let A[0..N-1], B[0..M-1]
for i+1= 1 to N ' Caution, this is syntactically wrong
    for j+1= i+1 to M ' Caution, this is syntactically wrong
        A[i+1-1]= B[j+1-1]

重写for子句并简化:

let A[0..N-1], B[0..M-1]
for i= 0 to N-1
    for j= i to M-1
        A[i]= B[j]