我正在尝试在Python中实现合并排序。我在Khan Academy上完成了一个合并排序课程,在那里他们让我用JavaScript来实现,但是我想尝试用Python来实现。
课程:https://www.khanacademy.org/computing/computer-science/algorithms#merge-sort
这是我的代码:
from math import floor
def merge(array, p, q, r):
left_array = []
right_array = []
k = p
while (k < q):
left_array.append(array[k])
k += 1
while (k < r):
right_array.append(array[k])
k += 1
k = p
i = 0
j = 0
while (i < len(left_array) and j < len(right_array)):
if (left_array[i] <= right_array[j]):
array[k] = left_array[i]
k += 1
i += 1
else:
array[k] = right_array[j]
k += 1
j += 1
while (i < len(left_array)):
array[k] = left_array[i]
k += 1
i += 1
while (j < len(right_array)):
array[k] = right_array[j]
k += 1
j += 1
print("Merging", array)
def merge_sort(array, p, r):
print("Splitting", array)
if p < r:
q = floor((p + r) / 2)
merge_sort(array, p, q)
merge_sort(array, q + 1, r)
merge(array, p, q, r)
test3 = [3, 2, 1]
merge_sort(test3, 0, len(test3))
我的代码中某处有一个错误,我似乎无法理解。我认为这与我的拼接有关,但是我无法确认。这是我底部测试的输出:
Splitting [3, 2, 1]
Splitting [3, 2, 1]
Splitting [3, 2, 1]
Splitting [3, 2, 1]
Merging [3, 2, 1]
Splitting [3, 2, 1]
Splitting [3, 2, 1]
Splitting [3, 2, 1]
Merging [3, 2, 1]
Merging [2, 1, 3]
我想到了从here.
添加打印语句的想法感谢您的帮助。谢谢!
答案 0 :(得分:0)
您的代码没有遵循所链接文本的约定,无论边界是互斥的还是互斥的。在文本中,它们是包含性的,但是在您的代码中,它们是不包含上限的。结果,当您有这两行时:
merge_sort(array, p, q)
merge_sort(array, q + 1, r)
第一种从array[p]
到array[q-1]
,第二种从array[q+1]
到array[r-1]
,最后您完全跳过了array[q]
。
我认为您会发现遵循文本的约定并使两者都包容会更容易。因此,修改您的代码,以
开头test3 = [3, 2, 1]
merge_sort(test3, 0, len(test3) - 1)
,然后从那里去。
您还可以使用python slice表示法极大地清理代码。例如:
left_array = []
right_array = []
k = p
while (k < q):
left_array.append(array[k])
k += 1
while (k < r):
right_array.append(array[k])
k += 1
可以简化为
left_array = array[p:q]
right_array = array[q:r]
尽管如我所说,您可能要开始使用包含索引。