【问题标题】:Merge Sort confusion, stack level too deep?合并排序混乱,堆栈级别太深?
【发布时间】:2018-05-08 15:44:44
【问题描述】:

所以我学习了归并排序(在 Ruby 中)并且我主要了解它的工作原理,所以我只是在编写“mergeSort”功能的开头并将数组拆分:

array = [5,1,8,3,4,6,11,2]

def mergeSort(arr,beginIndex,endIndex)
  if endIndex > beginIndex
    mid = (beginIndex+endIndex)/2 
    puts mid
    puts "#{arr[0..mid]}"
    puts "#{arr[mid+1..-1]}"
    mergeSort(arr,0,mid) #comment out here?
    mergeSort(arr,mid+1,arr.length-1) #or here?

  end


end
mergeSort(array,0,array.length-1)

所以我了解发生了什么,并且打印出来的内容正常工作。然而奇怪的是......如果我注释掉任何一个二级嵌套mergeSort(我说“#comment 在这里?还是在这里?)我会得到一个打印输出,就像我想的那样。但是如果我离开两者都将永远持续下去,直到我得到“堆栈级别太深”。这很奇怪,因为注释掉任何一个它都会在数组长度为 1 时停止。

为什么会这样?

【问题讨论】:

    标签: ruby algorithm mergesort


    【解决方案1】:

    第二个电话应该是mergeSort(arr,mid+1,endIndex)。

    如果您忽略第二个电话,它会很好地工作,因为您缩小到开头。如果您忽略第一个电话,它会很好地工作,因为您缩小到最后。如果你同时拥有两者,它会失败,因为你去排序前半部分并发现自己在第二次调用中仍然试图对整个数组进行排序......递归。

    【讨论】:

    • 啊哈!合并排序非常令人困惑,除非您似乎几乎是一步一步写出来的。
    猜你喜欢
    • 2014-08-23
    • 2012-03-04
    • 2013-10-05
    • 2011-11-17
    • 2012-07-24
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多