CLRS中伪代码的问题

时间:2015-06-13 17:39:54

标签: python algorithm sorting mergesort

我正在使用CLRS作为算法的介绍。我试图在Python中实现书中用伪代码编写的算法。但是,我遇到了问题,因为这本书从1开始索引。这就是我实现Merge Sort的方法,但是它无法正常工作:

def MergeSort(A, start, end):
    if(start < end):
        middle = math.floor((start + end)/2)
        MergeSort(A, start, middle)
        MergeSort(A, middle + 1, end)
        Merge(A, start, middle, end)

def Merge(A, start, middle, end):
    n1 = middle - start + 1
    n2 = end - middle
    L = [0] * n1
    R = [0] * n2
    for i in range(0, n1):
        L[i] = A[start + i - 1]
    for j in range(0, n2):
        R[j] = A[middle + j]
    i = 0
    j = 0
    for k in range(start, end):
        if(i >= n1):
            A[k] = R[j]
            j += 1
        elif(j >= n2):
             A[k] = L[i]
             i += 1
        elif(L[i] <= R[j]):
            A[k] = L[i]
            i += 1
        else:
            A[k] = R[j]
            j += 1

如何在没有这些(一个一个?)错误的情况下从伪代码转换为Python代码?

1 个答案:

答案 0 :(得分:1)

有一个小错误,很容易看到这个,你的合并函数的索引

A [start + i - 1] 应为 start + i

因为你从0开始循环i,start的值也可以得到0,这使得它开始+ i -1
以及

的迭代

start == i == 0

您的索引变为 -1 ,这实际上是Python中列表的最后一个元素

并在合并函数的最后一个循环中范围应为

表示范围内的k(开始,结束+ 1)因为必须从开始到结束时进行迭代

这应该运行正常

import math
def MergeSort(A, start, end):
    if(start < end):
        middle = math.floor((start + end)/2)
        MergeSort(A, start, middle)
        MergeSort(A, middle + 1, end)
        Merge(A, start, middle, end)

def Merge(A, start, middle, end):
    n1 = middle - start + 1
    n2 = end - middle
    L = [0] * n1
    R = [0] * n2
    for i in range(0, n1):
        L[i] = A[start + i ]
    for j in range(0, n2):
        R[j] = A[middle + j+1]
    i = 0
    j = 0
    for k in range(start, end+1):
        if(i >= n1):
            A[k] = R[j]
            j += 1
        elif(j >= n2):
             A[k] = L[i]
             i += 1
        elif(L[i] <= R[j]):
            A[k] = L[i]
            i += 1
        else:
            A[k] = R[j]
            j += 1


arr=[4,8,5,6,9,8,1]
MergeSort(arr,0,len(arr)-1)
print(arr)