繁体   English   中英

python 中的归并排序树实现

[英]mergesort tree implementation in python

n=4
arr=[1,2,3,4]
tree=[[] for i in range(2*n-1)]
def build_tree(idx,l,r):
    if l==r:
        tree[idx].append(arr[l])
    else:
        mid=(l+r)//2
        build_tree(2*idx,l,mid)
        build_tree(2*idx+1,mid+1,r)
        tree[idx]=merge(tree[2*idx],tree[2*idx+1])


def merge(left,right):
    myList=[]
    i=0
    j=0
    while i < len(left) and j < len(right):
        if left[i] < right[j]:

            myList.append(left[i])

            i += 1
        else:
            myList.append(right[j])
            j += 1



    while i < len(left):
        myList.append(left[i])
        i += 1


    while j < len(right):
        myList.append(right[j])
        j += 1

    return myList


if __name__ == '__main__':
    build_tree(0,0,n-1)
    print(tree)

我在 python https://discuss.codechef.com/t/merge-sort-tree-tutorial/14277中实现合并排序树。 .当我打印树时,我正在关注 output

[[1, 2, 3, 4], [3, 4], [3], [4], [], [], []] 这是错误的。

但是缺少诸如 [1] 和 [2] 之类的一些值。我没有错在哪里。互联网上没有 python 实现可用于合并排序树。请帮助我更正它,或者如果可能,请提供另一种实现在 python 中。

您在递归步骤中执行的索引数学是错误的,因此只出现树的右半部分。 这个问题与零索引有关。 如果根为零,则左分支需要为1 ,右分支需要为2 您的代码生成01 ,因此一半的树消失了。

尝试:

else:
    mid=(l+r)//2
    build_tree(2*idx+1,l,mid)          # +1 for idx argument here
    build_tree(2*idx+2,mid+1,r)        # +2 instead of +1 here
    tree[idx]=merge(tree[2*idx+1],tree[2*idx+2])  # also update the indexes used here

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM