簡體   English   中英

Python Quicksort運行時錯誤:cmp中超出最大遞歸深度

[英]Python Quicksort Runtime Error: Maximum Recursion Depth Exceeded in cmp

我正在編寫一個程序,它將讀取包含5,163個名稱的文本文件。 (文字文件可以在這里看到)

然后我想將名稱存儲到名為“names”的列表中,之后,我根據名稱包含的字母數量對列表進行排序,較短的名稱位於列表的開頭,較長的名稱位於結尾。

我使用quicksort對列表進行排序,但是當我運行它時,它會顯示以下錯誤:

C:\Python27\python.exe C:/Users/Lenovo/Desktop/Anagrams/Main.py
Traceback (most recent call last):
  File "C:/Users/Lenovo/Desktop/Anagrams/Main.py", line 25, in <module>
    names = quicksort(names)
  File "C:/Users/Lenovo/Desktop/Anagrams/Main.py", line 8, in quicksort
    greater = quicksort([x for x in list[1:] if not lessThan(x, pivot)])
  File "C:/Users/Lenovo/Desktop/Anagrams/Main.py", line 7, in quicksort
    lesser = quicksort([x for x in list[1:] if lessThan(x, pivot)])
  File "C:/Users/Lenovo/Desktop/Anagrams/Main.py", line 8, in quicksort
    greater = quicksort([x for x in list[1:] if not lessThan(x, pivot)])
  File "C:/Users/Lenovo/Desktop/Anagrams/Main.py", line 7, in quicksort
    lesser = quicksort([x for x in list[1:] if lessThan(x, pivot)])
# [.... many lines elided ...]
  File "C:/Users/Lenovo/Desktop/Anagrams/Main.py", line 8, in quicksort
    greater = quicksort([x for x in list[1:] if not lessThan(x, pivot)])
  File "C:/Users/Lenovo/Desktop/Anagrams/Main.py", line 8, in quicksort
    greater = quicksort([x for x in list[1:] if not lessThan(x, pivot)])
  File "C:/Users/Lenovo/Desktop/Anagrams/Main.py", line 7, in quicksort
    lesser = quicksort([x for x in list[1:] if lessThan(x, pivot)])
  File "C:/Users/Lenovo/Desktop/Anagrams/Main.py", line 3, in quicksort
    if list == []:
RuntimeError: maximum recursion depth exceeded in cmp

完整的追溯作為一個牧場

我已經測試了quicksort函數,它適用於普通列表(例如:list = ['Alice','Bob,'Carl','Derp']),但如果我嘗試排序'名字',它就不起作用

這是我的代碼

def quicksort(list):
    """Quicksort using list comprehensions"""
    if list == []:
        return []
    else:
        pivot = list[0]
        lesser = quicksort([x for x in list[1:] if lessThan(x, pivot)])
        greater = quicksort([x for x in list[1:] if not lessThan(x, pivot)])
        return lesser + [pivot] + greater

def lessThan(a, b):
    return len(a) < len(b)

#'''
input = open('Names.txt', 'r')
output = open('Names Arranged By Length.txt', 'w')

names = []

for line in input:
    line = line.translate(None, '\n')
    names.append(line)


names = quicksort(names)

for i in names:
    print i
    output.write(i)
    output.write('\n')

print 'Count: ', len(names)


input.close()
output.close()
#'''

我的代碼有什么問題,我該如何解決?

你只需要達到遞歸限制。 您的名稱列表對於Python的有限遞歸功能來說太大了。 你的Quicksort工作正常。

可以通過使用sys.setrecursionlimit()設置更高的限制提高遞歸限制。 您可以將其設置得更高,但您需要自擔風險。

更好的選擇是使用內置的Python排序; TimSort算法非常優越,不會達到遞歸限制:

names = sorted(names, key=len)

這會根據長度,最短的名稱對名稱進行排序。

您超過了python默認遞歸大小。 默認遞歸限制為1000.您可以增加遞歸限制但不建議使用。 這是怎么做的

import sys
sys.setrecursionlimit(1500)

建議
我的建議是使用numpy.argsort()方法,它已經為許多排序算法做好了准備。 以下是使用numpy庫進行快速排序算法的簡單考察

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM