我正在使用Python进行合并排序。
我已经检查了this
功能。数组合并得很好。
但是在merge
函数中出现错误:---
RuntimeError:超过最大递归深度。
RuntimeError跟踪(最近的调用) 最后)在() 63打印(arr [i]), 64 ---> 65 mergeSort(arr,0,n-1) 66打印(“”) 67 print(“排序数组为”)
在mergeSort(arr,l,r)中的53 m = l +(r-1)/ 2 54 mergeSort(arr,l,m) ---> 55 mergeSort(arr,m + 1,r) 56合并(arr,l,m,r) 57
这可能是什么原因?
mergeSort
答案 0 :(得分:3)
在m
中计算mergeSort
的方式是错误的(您需要将整个表达式除以一半,而不仅是(r-1)
)。更改为:
m = (l+(r-1))/2
当您计算错误时,您的方法将一次又一次地递归调用自身,直到超出最大方法堆栈深度并因此崩溃。
答案 1 :(得分:2)
m = l+(r-1)/2
写m = (l+r)/2
mergeSort(arr,0,n-1)
的时候n-1
是最后一个索引值,所以这就是r-1
中不需要m = l+(r-1)/2
的原因现在到了要点,为什么会出现 RecurssionError 这是答案
m =(l + r)/ 2
除法运算将给出分数部分,即m
将被视为浮动变量
因此m
永远不会是 0 ,它是任何浮点数,例如 0.123 或 2.122 或 1.0025
由于浮点数为m
永远不会 0 ,如果条件if l<r:
始终为true,并且 mergeSort() 函数进入无限循环,这就是为什么出现RunTime RecurssionERROR
您希望 m 为 整数 ,而不是 float =(l + r)/ 2
写 m =(l + r)// 2 , 地板除法运算符(//) 将为您提供整数值,并且您的 mergeSort()函数不会进入无限循环
您的代码这次将被执行而没有任何错误,只需进行一次更改 m =(l + r)// 2
但是,但是您的merge()函数算法不好,它没有给出排序的数组,数据也丢失了,还有其他东西被打印了
答案 2 :(得分:-1)
这是因为在调用mergesort函数时,您传递的是l = 0和r = list的长度。 而且无论在每种情况下计算结果如何,您的l都会小于r。
m = l+(r-1)/2