为什么此合并排序实现未给出正确答案?

时间:2019-10-02 12:14:19

标签: python algorithm sorting mergesort

我在Python中有2个合并排序实现,看起来很像,但是我不知道为什么其中1个不起作用。

def merge(left, right): 
    result = []
    i,j = 0,0
    while i < len(left) and j < len(right):
        if left[i] < right[j]:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1
    while (i < len(left)):
        result.append(left[i])
        i += 1
    while (j < len(right)):
        result.append(right[j])
        j += 1
    return result

def merge_sort(L):
    if len(L) < 2:
        return L[:]
    else:
        middle = len(L)//2
        left = merge_sort(L[:middle])
        right = merge_sort(L[middle:])
        return merge(left, right)

运行merge_sort([1,3,5,2,4,6])会得到[1, 2, 3, 4, 5, 6],这是正确的答案。

但是

def merge1(X,Y):
    result = []
    n = len(X)
    m = len(Y)
    i = 0
    j = 0
    while i < n and j < m:
        if X[i] < Y[j]:
            result.append(X[i])
            i += 1
        else:
            result.append(Y[j])
            j += 1
    while (i < n):
        result.append(X[i])
        i += 1
    while (j < n):
        result.append(Y[j])
        j += 1
    return result


def merge_sort1(L):
    if len(L)  <2 :
        return L[:]
    else:
        middle = len(L) // 2
        X = merge_sort1(L[:middle])
        Y = merge_sort1(L[middle:])
        return merge1(X,Y)

运行merge_sort1([1,3,5,2,4,6])会给出一个奇怪的答案[1, 2, 3, 4],这是错误的。

但是我不知道为什么第二次尝试给出的答案与第一次尝试相同时给出了错误的答案。 有什么问题,为什么会发生?

1 个答案:

答案 0 :(得分:2)

您写的是while (j < n):而不是while (j < m):