我不太确定为什么我的合并排序实现无法正常工作。
merge_sort将数组A以及起始和最终索引p和r作为参数。如果我尝试在A = [1、64、64、315、14、2、3、4、5]上运行merge_sort(A,1,9),A将变为A = [1、1、1、1、1 1,2,2,4,5]。我正在尝试使用一个前哨来检测L和R数组是否已用尽。
代码如下:
function merge_sort(A, p, r)
if p < r
q = floor(Int, (p+r)/2)
merge_sort(A, p, q)
merge_sort(A, q+1, r)
merge(A, p, q, r)
end
end
function merge(A, p, q, r)
n1 = q-p+1
n2 = r-q
L = []
R = []
for i = 1:n1
push!(L, A[p+1-1])
end
for j = 1:n2
push!(R, A[q+j])
end
sentinel = 123456789
push!(L, sentinel)
push!(R, sentinel)
i=1
j=1
for k=p:r
if L[i] <= R[j]
A[k] = L[i]
i = i+1
else
A[k] = R[j]
j = j+1
end
end
end
答案 0 :(得分:6)
您在push!(L, A[p+1-1])
中有一个错字,应该是push!(L, A[p+i-1])
。
这里是代码的清理版本(但我没有尝试对其进行完全优化以保留您的逻辑):
function merge_sort!(A, p = 1, r = length(A))
if p < r
q = div(p+r, 2)
merge_sort!(A, p, q)
merge_sort!(A, q+1, r)
merge!(A, p, q, r)
end
A
end
function merge!(A, p, q, r)
sentinel = typemax(eltype(A))
L = A[p:q]
R = A[(q+1):r]
push!(L, sentinel)
push!(R, sentinel)
i, j = 1, 1
for k in p:r
if L[i] <= R[j]
A[k] = L[i]
i += 1
else
A[k] = R[j]
j += 1
end
end
end