合并Python错误中的排序

时间:2018-11-03 22:07:43

标签: python python-3.x algorithm sorting mergesort

我正在尝试在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.

添加打印语句的想法

感谢您的帮助。谢谢!

1 个答案:

答案 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]

尽管如我所说,您可能要开始使用包含索引。