为什么列表的后半部分是在合并排序的递归调用中操作的注释

时间:2018-01-17 18:13:53

标签: python mergesort

我有一个任务在python中实现合并排序。我已经编写了代码,但我仍然坚持为什么代码在递归调用后没有打印列表的part_b,我该怎样修复它。

以下是代码

def merge_sort(list_sort):
    """splits the list in two parts until each part is left with one member"""

    if len(list_sort) ==  1:
        print len(list_sort)
        return list_sort

    if len(list_sort)>= 2:
        x= len(list_sort) / 2
        part_a = list_sort[:x]
        part_b = list_sort[x:]
        print part_a , part_b
        merge_sort(part_a)
        merge_sort(part_b)

    return merge(part_a, part_b)


def merge(left , right):
    """merges the two parts of list after sorting them"""
    print left, right 
    sorted_list = []
    if len(left) >= len(right):
        i = len(left)
        while i != 0:
            if left[i] > right[i]:
                sorted_list.append(right[i])
            else :
                sorted_list.append(left[i])
            i = i-1
        sorted_list += right[i:]
    else :
        i = len(right)
        while i != 0:
            if left[i] > right[i]:
                sorted_list.append(right[i])
            else :
                sorted_list.append(left[i])
            i = i-1
        sorted_list += left[i:]
    return sorted_list

details = [3, 7, 5, 12, 14, 11, 2, 6]
print merge_sort(details)

3 个答案:

答案 0 :(得分:1)

您正在尝试使用merge_sort,就像它在适当的位置操作一样,但它没有。您需要捕获其返回值:

recipient_id

答案 1 :(得分:1)

您的merge_sort函数会返回已排序的列表,但在您调用它的两个位置都会丢弃结果。您需要分配结果(将其绑定到名称),以便将这些结果传递给merge

if len(list_sort) >= 2:
    x= len(list_sort) / 2
    part_a = list_sort[:x]
    part_b = list_sort[x:]
    print part_a , part_b
    sorted_part_a = merge_sort(part_a)
    sorted_part_b = merge_sort(part_b)
    return merge(sorted_part_a, sorted_part_b)

答案 2 :(得分:1)

我认为你的说法不正确。我更新了您的print以标记输出

    print "SORT A", part_a , "\tB", part_b

print "MERGE left", left, "\tright", right

并获得预期的跟踪,直到它在合并阶段的索引处理不当崩溃。正如其他人所指出的那样,这是因为未能保存merge的返回值。

SORT A [3, 7, 5, 12]    B [14, 11, 2, 6]
SORT A [3, 7]   B [5, 12]
SORT A [3]  B [7]
1
1
MERGE left [3]  right [7]
Traceback (most recent call last):
  File "so.py", line 44, in <module>
    print merge_sort(details)
  File "so.py", line 13, in merge_sort
    merge_sort(part_a)
  File "so.py", line 13, in merge_sort
    merge_sort(part_a)
  File "so.py", line 16, in merge_sort
    return merge(part_a, part_b)
  File "so.py", line 26, in merge
    if left[i] > right[i]:
IndexError: list index out of range

每个OP COMMENT更新

由于你的(有效)调用顺序,B部分没有被操作:算法必须在部分B工作之前完成排序和合并部分A.由于索引范围错误,你没有那么远。你试图合并[3]和[7] - 分别是AAA和AAB。你从来没有把它备份到堆栈(AA和AB)来处理原始的B部分。