当一个接一个地运行快速排序算法时,但不是单独运行时,会出现最大递归深度错误



我必须在一堆包含未排序数字的数据文件上运行各种版本的快速排序、计数排序和气泡排序算法,以记录算法在不同数据集上花费的时间,我想编写一个脚本,这样我就不必为每个文件手动运行它们(我有很多)。

当我自己运行各种算法,在控制台中用Python"algorithmname".py-f"testfilepath"手动调用它们时,一切都很好。不幸的是,当我运行脚本在每个测试文件上一个接一个地运行它们时,我所实现的4个快速排序版本出现了问题。每次我运行脚本一个接一个地运行算法时,我都会得到以下错误:RuntimeError:相比之下,超过了最大递归深度。

以下是我如何在脚本文件中一个接一个地调用算法:

for dataFile in sorted(listdir("tp1-H10-donnees")):
inputFile = open("tp1-H10-donnees/" + dataFile, "r")    
unsortedList1 = [int(line.rstrip('n')) for line in inputFile]
unsortedList2 = unsortedList1
unsortedList3 = unsortedList1
unsortedList4 = unsortedList1
unsortedList5 = unsortedList1
unsortedList6 = unsortedList1
(algoTime, sortedList) = bubble.main(unsortedList1)
bubbleResult.append(dataFile + "tbubble sortt" + ", time = %.6fn" % algoTime)
(algoTime, sortedList) = counting.main(unsortedList2)
countingResult.append(dataFile + "tcounting sortttime = %.6fn" % algoTime)
(algoTime, sortedList) = quick.main(unsortedList3)
quickResult.append(dataFile + "tquick sortttime = %.6fn" % algoTime)
(algoTime, sortedList) = quickMed.main(unsortedList4)
quickMedResult.append(dataFile + "tquickMed sortttime = %.6fn" % algoTime)
(algoTime, sortedList) = quickSeuil.main(unsortedList5)
quickSeuilResult.append(dataFile + "tquickSeuil sortttime = %.6fn" % algoTime)
(algoTime, sortedList) = quickMedSeuil.main(unsortedList6)
quickMedSeuilResult.append(dataFile + "tquickMedSeuil sortttime = %.6fn" % algoTime)

在quicksort算法的主函数中,我只调用quick()函数,它是实现quicksord算法的函数,具有良好的参数。这里有一个例子:

def main(unsortedList):
# Execute algorithm
start = time.clock()
sortedList = quick(unsortedList, 0, (len(unsortedList) - 1), mediane=True, seuilRecurcivite=1)
end = time.clock()
return (end - start, sortedList)

这是我的快速排序实现:

import math
def quick(unsortedList, left, right, mediane=False, seuilRecurcivite=1):
if right - left >= seuilRecurcivite:
if (mediane == False):
pivotIndex = left
else:
pivotIndex = medianIndex(unsortedList, left, right);
pivotNewIndex = partition(unsortedList, left, right, pivotIndex)
quick(unsortedList, left, pivotNewIndex - 1)
quick(unsortedList, pivotNewIndex + 1, right)
elif right - left >= 1:
unsortedList[left:right+1] = bubble(unsortedList[left:right+1])
return unsortedList
def partition(unsortedList, left, right, pivotIndex):
pivotValue = unsortedList[pivotIndex]
unsortedList[pivotIndex], unsortedList[right] = unsortedList[right], unsortedList[pivotIndex]
storeIndex = left
for i in range(left, right):    # RUNTIME ERROR
if unsortedList[i] <= pivotValue:
unsortedList[i], unsortedList[storeIndex] = unsortedList[storeIndex], unsortedList[i]
storeIndex = storeIndex + 1
unsortedList[storeIndex], unsortedList[right] = unsortedList[right], unsortedList[storeIndex]
return storeIndex

medianIndex()只是一个函数,它将查找列表的第一个、中间和最后一个元素之间的中值的索引。

控制台告诉我发生错误的线路

for i in range(left, right):

但我不明白为什么当我运行一个接一个地运行每个算法的脚本时,它会给我带来错误,而当我单独运行时却不会。

谢谢你的帮助。

编辑:根据需要,这里是medianIndex()函数和它内部使用的med3()函数:

def med3(a, b, c):
if a <= b <= c or c <= b <= a:
return b
elif b <= a <= c or c <= a <= b:
return a
else:
return c
def medianIndex(list, left, right):
firstValue = list[left]
lastValue = list[right]
middleValue = list[math.ceil((left + right) / 2)]
medianValue = med3(firstValue, middleValue, lastValue)
return list.index(medianValue)

所以我发现了我的问题。它在以下代码中:

for dataFile in sorted(listdir("tp1-H10-donnees")):
inputFile = open("tp1-H10-donnees/" + dataFile, "r")    
unsortedList1 = [int(line.rstrip('n')) for line in inputFile]
unsortedList2 = unsortedList1
unsortedList3 = unsortedList1
unsortedList4 = unsortedList1
unsortedList5 = unsortedList1
unsortedList6 = unsortedList1

正确的方法是执行以下操作:

for dataFile in sorted(listdir("tp1-H10-donnees")):
inputFile = open("tp1-H10-donnees/" + dataFile, "r")    
unsortedList1 = [int(line.rstrip('n')) for line in inputFile]
unsortedList2 = list(unsortedList1)
unsortedList3 = list(unsortedList1)
unsortedList4 = list(unsortedList1)
unsortedList5 = list(unsortedList1)
unsortedList6 = list(unsortedList1)

以便基于unsortedList1创建新列表,而不仅仅指向unsortedList1。这在一定程度上解决了我的问题。

之后我遇到的另一个问题仍然是同样的错误,但只出现在最大的数据集(10万或50万个数字)上。这个问题是通过使用sys.setrecursionlimit 解决的

相关内容

最新更新