如何为合并排序算法修改数组in_place?[编辑]

时间:2017-09-22 18:37:35

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

我试图在这里为合并排序编写合并函数。

虽然我试图以递归方式编写函数,但我无法想出一种全局修改变量nums1的方法。

我无法通过test4,因为修改后的nums1永远不会全局返回。

class Solution(object):
    def merge(self, nums1, m, nums2, n):
        if not nums1:
            nums1[:] = nums2
            return

        if not nums2:
            return

        if nums1[0] < nums2[0]:
            self.merge(nums1[1: ], m - 1, nums2, n)
            return

        if nums1[0] >= nums2[0]:
            nums1[0], nums1[1:] = nums2[0], nums1[:]
            self.merge(nums1, m + 1, nums2[1:], n - 1)
            return



if __name__ == "__main__":
    # nums1 = [1, 2, 3]
    # nums2 = [-1, 4, 5]
    # Solution().merge(nums1, 3, nums2, 3)
    # assert nums1 == [-1, 1, 2, 3, 4, 5]

    nums1 = []
    nums2 = [2, 3, 4]
    Solution().merge(nums1, 0, nums2, 3)
    print("Outside", nums1)
    assert nums1 == [2, 3, 4]
    print('Test 1 passed!')

    nums1 = [1, 2, 3]
    nums2 = []
    Solution().merge(nums1, 3, nums2, 0)
    assert nums1 == [1, 2, 3]
    print('Test 2 passed!')

    nums1 = [1, 2, 3]
    nums2 = [-1]
    Solution().merge(nums1, 3, nums2, 1)
    assert nums1 == [-1, 1, 2, 3]
    print("Test 3 passed!")

    nums1 = [1, 2, 3]
    nums2 = [1.5]
    Solution().merge(nums1, 3, nums2, 1)
    print('outside nums1: ', nums1)
    assert nums1 == [1, 1.5, 2, 3]
    print("Test 4 passed!")

1 个答案:

答案 0 :(得分:0)

如果在表达式中使用列表的子范围(此处特别是作为函数调用的参数)而不是作为赋值的左侧,则创建新的独立列表:

>>> nums = [1,2,3]
>>> numsSub = nums[1:]
>>> numsSub[0] = 7
>>> nums
[1, 2, 3]
>>> numsSub
[7, 3]

可能的解决方案:

  1. 在调用单独变量之前分配子列表,在call as参数中使用它,并在调用后将其复制回nums1
  2. merge添加一个参数,该参数告诉nums1应该处理的第一项,并始终提供完整的nums1作为参数,例如:
  3. def merge(self, nums1, m, nums2, n, base=0): ... self.merge(nums1, m - 1, nums2, n, base + 1)