Julia合并排序实现无法正常工作

时间:2018-09-20 16:41:09

标签: sorting julia mergesort

我不太确定为什么我的合并排序实现无法正常工作。

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

1 个答案:

答案 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