【问题标题】:Python Merge function array range error?Python合并函数数组范围错误?
【发布时间】:2013-08-31 18:02:42
【问题描述】:

我正在尝试合并两个列表,但出现错误。有人有想法吗?

下面是我的合并函数。

 def mymerg(container, first_index, mid_index, last_index):
      left_list = container[:mid_index]
      right_list = container[mid_index:]
      i = 0
      j = 0
      for elem in range(first_index, last_index+1, 1):
           if left_list[i] <= right_list[j]:
                container[elem] = left_list[i]
                i = i + 1
           else:
                container[elem] = right_list[j]
                j = j + 1

这是我的排序函数,它在 My_Merge_Sort(container, first_index, mid_index) 行中生成错误

    def mymgsor(container, first_index, last_index):
            if first_index < last_index:
                    mid_index = len(container)//2
                    mymgsor(container, first_index, mid_index)
                    mymgsor(container, mid_index+1, last_index)
                    mymerg(container, first_index, mid_index, last_index)

如果 first_index

当我调用这个函数时,我使用 mymgsor(sample_list, 0, len(sample_list)-1)

【问题讨论】:

    标签: python arrays recursion mergesort


    【解决方案1】:

    使用heapq.merge 而不是自己实现。

    >>> import heapq
    >>> list(heapq.merge([1,3,5], [2,4,6,7,8]))
    [1, 2, 3, 4, 5, 6, 7, 8]
    

    使用 heapq.merge:

    >>> def mymgsor(container, first_index, last_index):
    ...     if first_index < last_index:
    ...         mid_index = (last_index+first_index) // 2
    ...         mymgsor(container, first_index, mid_index)
    ...         mymgsor(container, mid_index+1, last_index)
    ...         container[first_index:last_index+1] = heapq.merge(container[first_index:mid_index+1], container[mid_index+1:last_index+1])
    ...
    >>> xs = [5,4,2,3,1]
    >>> mymgsor(xs, 0, len(xs)-1)
    >>> xs
    [1, 2, 3, 4, 5]
    

    RuntimeError 原因:

    下一行总是产生相同的值;导致mymgsor的无限递归:

    mid_index = len(container)//2
    

    mymerg 计算索引错误。请尝试以下操作:

    def mymerg(container, first_index, mid_index, last_index):
        left_list = container[first_index:mid_index+1]   # copy only  first_index .. mid_index
        right_list = container[mid_index+1:last_index+1] # copy only mid_index+1 .. last_index
        i = 0
        j = 0
        for elem in range(first_index, last_index+1, 1):
            if left_list[i] <= right_list[j]:
                container[elem] = left_list[i]
                i += 1
                if i == len(left_list): # no more left
                    container[elem+1:last_index+1] = right_list[j:]
                    break
            else:
                container[elem] = right_list[j]
                j += 1
                if j == len(right_list): # no more right
                    container[elem+1:last_index+1] = left_list[i:]
                    break
    

    【讨论】:

    • 谢谢!!!!!!所以我尝试了 mid_index = (first_index + last_index)//2 但仍然无法正常工作。任何的想法?不过谢谢!
    • @dfsadxsadqwd213,我使用heapq.merge添加了替代mymgsor。
    • @dfsadxsadqwd213,您的原始代码在mymerg 中计算索引的方式错误。
    • @dfsadxsadqwd213,是的,我是认真的。
    • @dfsadxsadqwd213,我添加了修改mymerg
    猜你喜欢
    • 1970-01-01
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多