如何在Ruby中实现链接列表的合并排序

我想在Ruby中实现merge sort for a single linked list

此代码正在运行,没有任何错误,但未按预期输出。

class Node
    attr_accessor :data,:next
    def initialize(value)
        @data = value
        @next = nil
    end
end

合并排序方法:

def mergesort(head)
    return head if !head || !head.next

    a,b = frontbacksplit(head)
    mergesort(a)
    mergesort(b)
    c = sortedmerge(a,b) #something is going wrong here
end

此方法用于将列表分为两个子列表:

def frontbacksplit(head)
    slow = head
    fast = head.next
    until fast.nil?
        fast = fast.next
        unless fast.nil?
            slow = slow.next
            fast = fast.next
        end
    end
    a = head
    b = slow.next
    slow.next = nil
    [a,b]
end

此方法可能有误:

def sortedmerge(a,b)
    result = nil

    if a.nil?
        return b
    elsif b.nil?
        return a
    end

    if a.data <= b.data
        result = a
        result.next = sortedmerge(a.next,b)
    else
        result = b
        result.next = sortedmerge(a,b.next)
    end
    result
end
quhongliang 回答:如何在Ruby中实现链接列表的合并排序

问题出在mergesort方法中。原始实现定义为:

void MergeSort(Node** headRef) 
{ 
   ...
   MergeSort(&a); 
   MergeSort(&b); 

   *headRef = SortedMerge(a,b); 
} 

这意味着它正在更改ab的内容。

由于Ruby没有通过引用语义进行调用,因此您只是忘了将结果分配回Ruby版本的ab中来重复此行为。

解决方法:

def mergesort(head)
  ...
  a = mergesort(a)
  b = mergesort(b)
  sortedmerge(a,b)
end
本文链接:https://www.f2er.com/3053830.html

大家都在问