为啥逻辑适用于函数但不使用类,合并排序算法

Posted

技术标签:

【中文标题】为啥逻辑适用于函数但不使用类,合并排序算法【英文标题】:Why the logic works with functions but not using Classes, Merge sort algorithm为什么逻辑适用于函数但不使用类,合并排序算法 【发布时间】:2022-01-17 11:28:35 【问题描述】:

我使用函数实现了归并排序,它按预期工作。但是,当包装在一个类中时,它会给出 Time Limit Exceeded 错误。我认为这与类对象的底层内存分配方式有关,有人可以帮我详细了解导致这种情况的原因吗?


# 2 ------ Using Class
class Solution:
    def mergeSortedLists(self, nums, start, mid, end):

        l1 = nums[start: mid+1]
        l2 = nums[mid+1: end+1]

        i, j = 0, 0
        while i < len(l1) and j < len(l2):

            if l1[i] < l2[j]:
                nums[start] = l1[i]
                i += 1
            else:
                nums[start] = l2[j]
                j += 1

            start += 1

        if i < len(l1):
            nums[start:end + 1] = l1[i:]
        else:
            nums[start:end + 1] = l2[j:]

    def mergeSort(self, nums, start, end):

        while start < end:
            mid = (start + end) // 2
            self.mergeSort(nums, start, mid)
            self.mergeSort(nums, mid + 1, end)
            self.mergeSortedLists(nums, start, mid, end)

    def sortArray(self, nums):
        return self.mergeSort(nums, 0, len(nums) - 1)

a= Solution()
print(a.sortArray([7,6,4,3,2,1]))

【问题讨论】:

【参考方案1】:

删除类包装器无法使其成为正确的排序。 mergeSort 中的 while 循环毫无意义。 startend 永远不会改变。你想要:

    def mergeSort(self, nums, start, end):
        if start >= end:
            return
        mid = (start + end) // 2
        self.mergeSort(nums, start, mid)
        self.mergeSort(nums, mid + 1, end)
        self.mergeSortedLists(nums, start, mid, end)

小测试存根也只能打印None。在这里你想要:

nums = [7,6,4,3,2,1]
Solution().sortArray(nums)
print(nums)

【讨论】:

以上是关于为啥逻辑适用于函数但不使用类,合并排序算法的主要内容,如果未能解决你的问题,请参考以下文章

算法导论中,为啥合并排序的递归树的高度为lgn?

为啥合并排序用于 Android/Java API 中的对象?

有人可以帮助解释这种合并排序算法是如何工作的吗?

如何使用 fork 进程实现合并排序?

为啥多变量赋值适用于快速排序算法但不适用于逐行赋值?

C++ 不知算法系列之聊聊希尔归并排序算法中的分治哲学