#python #python-3.x #algorithm #sorting #mergesort
Вопрос:
Вот простой алгоритм сортировки слиянием, который я пытался реализовать на python. Я попытался сделать это без использования левых и правых параметров, которые можно найти в других местах, только с помощью срезов.
from math import floor
def merge(A, B):
"""Mearges the two sorted lists A and B"""
merged = []
i, j = 0, 0
while i < len(A) and j < len(B):
if A[i] <= B[j]:
merged.append(A[i])
i = 1
else:
merged.append(B[j])
j = 1
if j == len(B):
merged.extend(A[i:])
elif i == len(A):
merged.extend(B[j:])
return merged
def merge_sort(A):
if len(A) == 1:
return A
m = floor(len(A) / 2)
half1 = A[0:m]
half2 = A[m:]
A = merge_sort(half1)
B = merge_sort(half2)
R = merge(A, B)
return R
def main():
C = [6, 7, 2]
print(merge_sort(C))
exit()
if __name__ == "__main__":
main()
И это прекрасно работало.
Но когда я попытался
A = merge_sort(A[0:m])
B = merge_sort(A[m:])
вместо того, чтобы использовать переменные half1
и half2
merge_sort
функции, я получил это:
Traceback (most recent call last):
File "/home/aayush/PyProgs/mrg_sort.py", line 44, in <module>
main()
File "/home/aayush/PyProgs/mrg_sort.py", line 40, in main
print(merge_sort(C))
File "/home/aayush/PyProgs/mrg_sort.py", line 32, in merge_sort
B = merge_sort(A[m:])
File "/home/aayush/PyProgs/mrg_sort.py", line 31, in merge_sort
A = merge_sort(A[0:m])
File "/home/aayush/PyProgs/mrg_sort.py", line 31, in merge_sort
A = merge_sort(A[0:m])
File "/home/aayush/PyProgs/mrg_sort.py", line 31, in merge_sort
A = merge_sort(A[0:m])
[Previous line repeated 993 more times]
File "/home/aayush/PyProgs/mrg_sort.py", line 25, in merge_sort
if len(A) == 1:
RecursionError: maximum recursion depth exceeded while calling a Python object
Пожалуйста, скажите мне, что я сделал не так.
Комментарии:
1. Я рекомендую: Начните отладку. Взгляните на параметры перед запуском программы и проверьте, содержат ли они то, что вы от них ожидаете.
2. Один незначительный момент: вам, вероятно, следует использовать
if len(A) <= 1
. И:A = merge_sort(A[0:m])
изменяетA
, поэтомуB = merge_sort(A[m:])
использует измененноеA
, а не оригинальное.3. Только что увидел это: в этом смысл ответа @sahasrara62.
Ответ №1:
вам просто нужно следить за именованием переменных, так как здесь A обновляется, и вы используете данные этого списка, а не исходные
def merge_sort(A):
if len(A) == 1:
return A
m = floor(len(A) / 2)
c = merge_sort(A[0:m])
B = merge_sort(A[m:])
R = merge(c, B)
return R
Ответ №2:
Вы пробовали работать с меньшими данными ?
Попробуй :
импорт sys sys.setrecursionlimit(10000)
Затем повторите попытку, если алгоритм не завершен, у вас бесконечный цикл