首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python中的合并排序/递归

python中的合并排序/递归
EN

Stack Overflow用户
提问于 2017-11-05 17:36:00
回答 1查看 1.8K关注 0票数 0

我理解合并排序是如何工作的,但是当我尝试在python中实现时,我想我仍然对堆栈上的事情是如何工作的感到有点困惑。我有一个名为merge_sorted_list的函数,用于合并两个排序列表,以及一个名为merge_sort1和merge_sort2的函数,这两个函数负责递归过程。"merge_sort1“和" merge_sort2”非常相似,但只有merge_sort2给出了正确的答案。看起来,merge_sort1并没有在堆栈的每个级别接受返回的值。有人能告诉我merge_sort1和merge_sort2之间的评价有什么不同吗?

代码语言:javascript
复制
def merge_sorted_list(list1,list2):

    if(len(list1) == 0 or len(list2) == 0):
        print('input error')
        return;

    i = 0
    j = 0
    k = 0
    list_merge = [0]*(len(list1) + len(list2))
    while(i < len(list1) and j < len(list2)):
        if (list1[i] < list2[j]):
            list_merge[k] = list1[i]
            i += 1
        else:
            list_merge[k] = list2[j]
            j += 1
        k += 1
    while(i < len(list1)):
        list_merge[k] = list1[i]
        i += 1
        k += 1
    while (j < len(list2)):
        list_merge[k] = list2[j]
        j += 1
        k += 1
    return(list_merge)

def merge_sort1(mylist):
    print("splitting ",mylist)
    if (len(mylist) > 1):
        mid = len(mylist)//2
        merge_sort1(mylist[:mid])
        merge_sort1(mylist[mid:])

    #   lefthalf = mylist[:mid]
    #   righthalf = mylist[mid:]

    #   merge_sort1(lefthalf)
    #   merge_sort1(righthalf)

        mylist[:] = merge_sorted_list(mylist[:mid],mylist[mid:])
        print("merging result ",mylist)
    return mylist

def merge_sort2(mylist):
    print("splitting ",mylist)
    if (len(mylist) > 1):

        mid = len(mylist)//2
#       merge_sort2(mylist[:mid])
#       merge_sort2(mylist[mid:])

        lefthalf = mylist[:mid]
        righthalf = mylist[mid:]

        merge_sort2(lefthalf)
        merge_sort2(righthalf)

        mylist[:] = merge_sorted_list(lefthalf,righthalf)
        print("merging result ",mylist)
    return mylist

如果我们尝试merge_sort1(4,67,3,3,2,6),输出将是

代码语言:javascript
复制
('splitting ', [4, 67, 3, 3, 2, 6])
('splitting ', [4, 67, 3])  
('splitting ', [4])
('splitting ', [67, 3])
('splitting ', [67])
('splitting ', [3])
('merging result ', [3, 67])
('merging result ', [4, 67, 3])
('splitting ', [3, 2, 6])
('splitting ', [3])
('splitting ', [2, 6])
('splitting ', [2])
('splitting ', [6])
('merging result ', [2, 6])
('merging result ', [2, 3, 6])
('merging result ', [3, 2, 4, 6, 67, 3])

Merge_sort2的产出(4,67,3,3,2,6)为

代码语言:javascript
复制
('splitting ', [4, 67, 3, 3, 2, 6])
('splitting ', [4, 67, 3])
('splitting ', [4])
('splitting ', [67, 3])
('splitting ', [67])
('splitting ', [3])
('merging result ', [3, 67])
('merging result ', [3, 4, 67])
('splitting ', [3, 2, 6])
('splitting ', [3])
('splitting ', [2, 6])
('splitting ', [2])
('splitting ', [6])
('merging result ', [2, 6])
('merging result ', [2, 3, 6])
('merging result ', [2, 3, 3, 4, 6, 67])

非常感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-05 17:52:04

mylist[:mid]返回一个列表。在list_sort1中,您正在(尝试)对这个列表进行排序,然后立即丢弃它。稍后,您将使用第二个(未修改的) mylist[:mid]实例。等。为了mylist[mid:]。另一方面,在第二个版本中,您将mylist[:mid]等的结果分配给变量,因此不会丢弃排序结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47124512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档