【发布时间】:2017-01-11 19:33:37
【问题描述】:
我正在学习python中的归并排序,我对以下程序的实现有点困惑。据我了解,mergeSort ([3,1], compare)在实现的时候,会分裂成mergeSort([3], compare)和mergeSort([1], compare)。然后应该调用merge([3],[1], compare),所以print语句应该是left = [1,3],但程序实际上打印出left = [3,1],其他print语句也是如此,为什么?非常感谢。
def merge(left, right, compare):
"""Assumes left and right are sorted lists and compare defines an ordering
on the elements.
Returns a new sorted (by compare list containing the same elements as
(left + right) would contain."""
result = []
i,j = 0, 0
while i < len(left) and j < len(right):
if compare(left[i], right[j]):
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
while (i < len(left)):
result.append(left[i])
i += 1
while (j < len(right)):
result.append(right[j])
j += 1
return result
import operator
def mergeSort(L, compare = operator.lt):
"""Assumes L is a list, compare defines an ordering on elements of L
Returns a new sorted list containing the same elements as L"""
if len(L) < 2:
return L[:]
else:
middle = len(L)//2
print "middle =", middle
left = mergeSort(L[:middle], compare)
print "left = ", L[:middle]
right = mergeSort(L[middle:], compare)
print "right = ", L[middle:]
return merge(left, right, compare)
>>> L = [3,1,2,5,4,9,6,7,8]
>>> mergeSort(L, compare = operator.lt)
middle = 4
middle = 2
middle = 1
left = [3]
right = [1]
left = [3, 1]
middle = 1
left = [2]
right = [5]
right = [2, 5]
left = [3, 1, 2, 5]
middle = 2
middle = 1
left = [4]
right = [9]
left = [4, 9]
middle = 1
left = [6]
middle = 1
left = [7]
right = [8]
right = [7, 8]
right = [6, 7, 8]
right = [4, 9, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
【问题讨论】:
-
非常感谢,您说的完全正确。排序根本不会影响列表 L,它会创建一个新列表,而我所做的只是从旧的 L 列表中打印。我说的对吗?
标签: python recursion mergesort