python - 错误的合并排序

标签 python mergesort

下面是我的合并函数,它应该类似于CLRS中显示的内容第 31 页。现在我已经注释掉了处理任何剩余列表项的代码。

如果我传递 A = [1, 2, 1, 12, 2, 5] 作为输入。输出为 [1, 2, 1, None, None, None]。

有人能告诉我我做错了什么吗?

def Merge(left, right):
    result = [None] * (len(left) + len(right))
    i, j, k = 0, 0, 0

    while i < len(left) and j < len(right):
        if left[i] < right[j]:
            result[k] = left[i]
            #result.append(left[i])
            i += 1
        else:
            result[k] = right[j]
            #result.append(right[j])
            j += 1
        k += 1

## remaining items in remaining list
##    while i < len(left):
##        result[k] = left[i]
##        i += 1; k+= 1;
##
##    while j < len(right):
##        result[k] = right[j]
##        j += 1; k+= 1;
##
    return result

## Ref.: CLRS page 34
def MergeSort(A):
    if len(A) > 1:
        mid = int(len(A)/2)
        left = A[:mid]
        right = A[mid:]
        MergeSort(left)
        MergeSort(right)
        return Merge(left, right)
    else:
        return A

if __name__ == "__main__":
    a = [1, 2, 1, 12, 2, 5]
    print "a = %s" % a
    print "sort a = %s" % MergeSort(a)

最佳答案

当调用MergeSort时,您会递归地返回新列表,但永远不会分配它们:

def Merge(left, right):
    result = [None] * (len(left) + len(right))
    i, j, k = 0, 0, 0

    while i < len(left) and j < len(right):
        if left[i] < right[j]:
            result[k] = left[i]
            #result.append(left[i])
            i += 1
        else:
            result[k] = right[j]
            #result.append(right[j])
            j += 1
        k += 1

## remaining items in remaining list
##    while i < len(left):
##        result[k] = left[i]
##        i += 1; k+= 1;
##
##    while j < len(right):
##        result[k] = right[j]
##        j += 1; k+= 1;
##
    return result

## Ref.: CLRS page 34
def MergeSort(A):
    if len(A) > 1:
        mid = int(len(A)/2)
        left = A[:mid]
        right = A[mid:]
        #MergeSort(left)
        # here should be
        left = MergeSort(left)
        #MergeSort(right)
        # here should be
        right = MergeSort(right)
        return Merge(left, right)
    else:
        return A

if __name__ == "__main__":
    a = [1, 2, 1, 12, 2, 5]
    print "a = %s" % a
    print "sort a = %s" % MergeSort(a)

关于python - 错误的合并排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23655216/

相关文章:

sorting - 自然mergesort链表

java - 为什么就地合并排序不稳定?

python - 根据值分离数据

python - Django: AttributeError: 'bool' 对象没有属性 'expire'

python - Numba autojit 函数比矢量化 Numpy 方法慢

python - 算法反转次数 (Python)

algorithm - 为了更快速地搜索,难道不应该在进行二分搜索之前对数据应用合并排序,还是直接跳到线性搜索?

python - 导入 pytesseract

Python Setuptools 构建 RPM 错误

algorithm - 归并排序是一种自适应算法吗?