我不太确定为什么我的合并排序实现不起作用。

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, 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

最佳答案

您在 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

关于sorting - Julia 合并排序实现无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52429659/

10-10 04:19