我正在阅读算法简介 - 第三版,我陷入了合并排序问题。我想在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时,是否有人可以解释我的解决方案?
答案 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]