Я видел много реализации Python Mergesort, и я придумал следующий код. Общая логика работает нормально, но не дает правильных результатов. Любая помощь высоко ценится.
Код:
def merge(left, right):
temp = []
i = 0
j = 0
while i < len(left) and j < len(right):
if left[i] <= right[j]:
temp.append(left[i])
i = i + 1
else:
temp.append(right[j])
j = j+ 1
print("i = ", i, "j = ", j)
while i < len(left):
temp.append(left[i])
i += 1
while j < len(right):
temp.append(right[j])
j += 1
print("Returned from merge", temp)
return temp
def mergesort(data):
if len(data) < 2:
return
left = data[:len(data)//2]
print(left)
right = data[len(data)//2:]
print(right)
print("left only now")
mergesort(left)
print("right now")
mergesort(right)
return merge(left,right)
data = mergesort([1,20, 30, 25, 8, 7, 9])
В основной функции слияния я думаю, что последняя строка не является правильной.
1 ответ
Вызываемая сортировка не изменяет свой аргумент, а возвращает новый отсортированный список.
Простое исправление будет:
def mergesort(data):
if len(data) < 2:
return data # Fix1
left = data[:len(data)//2]
print(left)
right = data[len(data)//2:]
print(right)
print("left only now")
left = mergesort(left) # Fix2
print("right now")
right = mergesort(right) # Fix3
return merge(left,right)
data = mergesort([1,20, 30, 25, 8, 7, 9])
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.