我正在使用递归Python进行合并排序。 我无法找出错误的地方,总是得错错误的答案。 代码如下:
def mergeSort(xlist):
print ('Splitting',xlist, len(xlist))
if len(xlist)>1:
midpoint = len(xlist) // 2
left = xlist[:midpoint]
right = xlist[midpoint:]
print ('----------------------------')
mergeSort(left)
mergeSort(right)
print (left, 'r', right)
while len(right) >0:
left.append(right[0])
right.remove(right[0])
slot= len(left)-1
while slot >0:
if left[slot] < left[slot-1]: left[slot], left[slot-1] = left[slot-1], left[slot]
slot -= 1
print ('sorted',left, right,xlist)
return left
print('A',mergeSort([100,1,91,54]))
合并时,输出也会以错误的方式显示,如:
Splitting [100, 1, 91, 54]
----------------------------
Splitting [100, 1] 2
----------------------------
Splitting [100] 1
Splitting [1] 1
[100] r [1]
sorted [1, 100] [] [100, 1]
Splitting [91, 54] 2
----------------------------
Splitting [91] 1
Splitting [54] 1
[91] r [54]
sorted [54, 91] [] [91, 54]
[100, 1] r [91, 54]
sorted [1, 54, 100, 91] [] [100, 1, 91, 54]
A [1, 54, 100, 91]
我希望最后的第三行应该是&#34; [1,100] r [54,91]&#34;回来后。 这有什么不对?我知道interactivePython.org中有一个代码,但我想知道我在哪里犯了逻辑错误。谁能帮我?非常感谢!
答案 0 :(得分:1)
您需要确定您的mergesort
代码是否要修改它在适当位置传递的列表,或者是否要返回新列表。编写代码的顶部部分就好像它会修改列表一样。写下半部分就好像它返回一个新列表一样。他们都需要以同样的方式工作,或者排序不会起作用。
如果你想坚持使用就地修改方法,代码的顶部很好,它只是最后left
和right
的合并。你需要解决。您需要合并到left
,而不是合并到xlist
。我建议在三个列表中的每个列表中使用单独的索引,而不是像您当前那样在left
中进行代价高昂的插入。
如果要返回新列表,则需要更改代码的顶部。如果您点击基本案例(len(xlist) < 2
),则需要不修改xlist
。您还需要保存递归调用的返回值,可能使用left = mergesort(left)
和right = mergesort(right)
。您以后的合并代码可能没问题,但它会丢弃合并排序的大多数性能优势,因为插入逻辑是O(N**2)
。
答案 1 :(得分:0)
我花了几分钟,但我找到了。你在左边和左边再次出现右半部分正确,但随后你丢弃结果并合并原始列表。校正:
print ('----------------------------')
left = mergeSort(left)
right = mergeSort(right)
我希望你现在能看到效果。
以下是产生上述输出的工作代码:
def mergeSort(xlist):
print 'Splitting', xlist, len(xlist)
if len(xlist) <= 1:
return xlist
else:
midpoint = len(xlist) // 2
left = xlist[:midpoint]
right = xlist[midpoint:]
print ('----------------------------')
left = mergeSort(left)
right = mergeSort(right)
print left, 'r', right
# print "merge", left, right
while len(right) > 0:
left.append(right[0])
right.remove(right[0])
slot = len(left) - 1
while slot > 0:
if left[slot] < left[slot-1]:
left[slot], left[slot-1] = left[slot-1], left[slot]
# print "switched", left
slot -= 1
print 'sorted', left, right, xlist
return left
print 'A',mergeSort([100,1,91,54])
输出:
A Splitting [100, 1, 91, 54] 4
----------------------------
Splitting [100, 1] 2
----------------------------
Splitting [100] 1
Splitting [1] 1
[100] r [1]
sorted [1, 100] [] [100, 1]
Splitting [91, 54] 2
----------------------------
Splitting [91] 1
Splitting [54] 1
[91] r [54]
sorted [54, 91] [] [91, 54]
[1, 100] r [54, 91]
sorted [1, 54, 91, 100] [] [100, 1, 91, 54]
[1, 54, 91, 100]