Julia merge-sort实现无法正常工作

Sim*_*men 4 sorting mergesort julia

我不太清楚为什么我的merge-sort实现不起作用.

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
Run Code Online (Sandbox Code Playgroud)

Bog*_*ski 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
Run Code Online (Sandbox Code Playgroud)