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

用户591

我想为Ruby中的单个链接列表实现合并排序

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

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
卡斯珀

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

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

   *headRef = SortedMerge(a, b); 
} 

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

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

解决方法:

def mergesort(head)
  ...
  a = mergesort(a)
  b = mergesort(b)
  sortedmerge(a, b)
end

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在我的“合并排序”实现中发现错误?

来自分类Dev

在JavaScript中实现合并排序

来自分类Dev

在python中实现合并排序

来自分类Dev

在C中调试合并排序实现

来自分类Dev

在JavaScript中实现合并排序算法

来自分类Dev

合并排序实现中的“预期的声明”

来自分类Dev

双向链接列表-合并排序后更新列表->尾

来自分类Dev

如何在Java中实现链接列表?

来自分类Dev

合并排序实现java

来自分类Dev

拆分集合后如何在合并排序中应用合并逻辑?

来自分类Dev

如何在合并排序中对合并操作进行多线程处理?

来自分类Dev

在Java中实现合并排序:只有零

来自分类Dev

此合并排序实现中的错误是什么?

来自分类Dev

拆分反转的合并排序实现中的错误在哪里

来自分类Dev

C++中的合并排序代码实现

来自分类Dev

如何在Ruby中反向链接列表

来自分类Dev

合并列表的合并排序

来自分类Dev

如何在合并排序中找到最低和最高

来自分类Dev

如何调用合并排序

来自分类Dev

合并排序实现查询

来自分类Dev

Rust实现合并排序的迭代器

来自分类Dev

Python:就地合并排序实现问题

来自分类Dev

在agda中合并排序

来自分类Dev

在C ++中合并排序

来自分类Dev

在agda中合并排序

来自分类Dev

排序链接列表实现

来自分类Dev

合并排序变体:使用链接数组

来自分类Dev

在C中的合并排序程序中实现冒泡排序时出错

来自分类Dev

如何在链接列表中实现泛型<E>?