python - 仅使用一个辅助数组实现合并排序(而不是递归地创建新数组)

标签 python python-3.x algorithm python-2.7 mergesort

实现合并排序的基本方法随处可见,我们每次执行拆分时递归地创建新的左右数组 -

https://www.geeksforgeeks.org/merge-sort/ --> [1]

我只想创建一个辅助数组,就像在下面的链接中所做的一样-

https://www.coursera.org/learn/algorithms-part1/lecture/ARWDq/mergesort ->[2] - 分钟 (7 - 10)

讲师在视频中明确指出在 9:30 - 重要的是不要在递归例程中创建辅助数组,因为这可能会导致创建额外数组的大量成本。由于该错误,您有时会看到 Mergesort 性能不佳。

它不会递归地创建新数组。

基本上,我想用python编写coursera链接中提到的代码

这是我到目前为止写的->

class merge_sort:

    def __init__(self, data):
        self.data = data

    aux_array = []


    def merge(array, aux_array, low, mid, high):

        for k in range(low, high):
            aux_array[k] = self.data[k]

        i = low
        j = mid + 1
        for k in range(low, high):
            if(i > mid):
                self.data[k] = aux_array[i]
                i = i +1
            elif(j > high):
                self.data[k] = aux_array[j]
                j = j +1
            elif(aux_array[i] < aux_array[j]):
                self.data[k] = aux_array[i]
                i = i +1
            else:
                self.data[k] = aux_array[j]
                j = j +1


    def mergesort(self, data, low, high):
        #high = len(data)
        mid = (high - low)//2
        mergesort(data, low, mid)
        mergesort(data, mid+1, high)
        merge(data, aux_array, low, mid, high)


    def start_sort(self):
        high = len(self.data) - 1
        self.mergesort(self.data, 0, high)


arr = [10,2,30,0,4]

arr1 = merge_sort(arr)
arr1.start_sort()
print(arr1)

我目前遇到以下错误 -

TypeError: mergesort() takes 3 positional arguments but 4 were given

我也试过这样做 -

@classmethod
    def mergesort(cls, data, low, high):
        #high = len(data)
        mid = (high - low)//2
        mergesort(data, low, mid)
        mergesort(data, mid+1, high)
        merge(data, aux_array, low, mid, high)

    def start_sort(self):
        high = len(self.data) - 1
        self.mergesort(self.data, 0, high)

在这种情况下,我得到以下错误 -

NameError: name 'mergesort' is not defined

最佳答案

我只有 python 2.7。我没有使用类。评论中指出的修复。

def merge(array, aux_array, low, mid, high):
    for k in range(low, high+1):                # fix (high+1)
        aux_array[k] = array[k]                 # fix (array)
    i = low
    j = mid + 1
    for k in range(low, high+1):                # fix (high+1)
        if(i > mid):
            array[k] = aux_array[j]             # fix (j)
            j = j +1                            # fix (j)
        elif(j > high):
            array[k] = aux_array[i]             # fix (i)
            i = i +1                            # fix (i)
        elif(aux_array[i] <= aux_array[j]):     # fix (<=)
            array[k] = aux_array[i]
            i = i +1
        else:
            array[k] = aux_array[j]
            j = j +1

def mergesort(array, aux_array, low, high):     # fix (names)
    if(low >= high):                            # fix (size < 2)
        return                                  # fix (size < 2)
    mid = low + ((high - low)//2)               # fix (low +)
    mergesort(array, aux_array, low, mid)       # fix (names)
    mergesort(array, aux_array, mid+1, high)    # fix (names)
    merge(array, aux_array, low, mid, high)     # fix (names)

def start_sort(array):                          # fix (names)
    aux_array = [0] * len(array)                # fix allocate aux_array
    mergesort(array, aux_array, 0, len(array)-1)

arr = [10,2,30,0,4]

start_sort(arr)                                 # fix
print(arr)                                      # fix

关于python - 仅使用一个辅助数组实现合并排序(而不是递归地创建新数组),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56465385/

相关文章:

regex - 美国电话号码验证

algorithm - 领导人选择

python - 从偏好列表中找到可行的组合

python - Pandas - 如果列较大且不为空则生成值

python - 如何测试 popplerqt5 中的注释类型?

excel - 使用 df.to_csv() 和 'utf-8' 将希伯来语写成 excel 出现奇怪的字符

python - Pyparsing:在parseaction中访问外部ParseResults

python - 无法解析网页中不同海报的链接

python - 我想在 RSS 提要描述标签中获取图像链接

python - Socket.IO 与 Twisted