【问题标题】:Why this Merge Sort does not work properly?为什么这个合并排序不能正常工作?
【发布时间】:2020-10-12 07:56:43
【问题描述】:

我需要使用 Python 3 实现合并排序。我编写了它。但它没有给出正确的输出。请问有人可以查吗? 这是我的代码,

def mergeSort(A, p, r): 
    if p < r:
        q = (p + r) // 2
        mergeSort(A, p, q)
        mergeSort(A, q+1, r)
        Merge(A, p, q, r)

def Merge(A, p, q, r):
    i = 1
    j = q+1
    k = 0
    TEMP = [0] * (r+1)

    while i <= q and j <= r:
        if A[i] <= A[j]:
            TEMP[k] = A[i]
            k += 1
            i += 1
        else:  
            TEMP[k] = A[j] 
            k += 1
            j += 1
    if (j > r) :
        for t in range(0, q-1):
            A[r-t] = A[q-t]

    for t in range(0, k-1):
       A[p+t] = TEMP[t+1]

A = [15, 16, 13, 10, 19, 18]
mergeSort(A, 0, len(A)-1)
print(A)

谢谢

【问题讨论】:

  • @trincot 你能找出问题所在吗?
  • 您已经粘贴了代码,但它丢失了函数内部的缩进。请更正
  • @AbhinavMathur 现在可以了吗?

标签: python python-3.x algorithm sorting mergesort


【解决方案1】:

你执行合并的方式看起来很奇怪(对我来说),但我会纠正你目前的情况。

1- i的初始化值不对,应该是:

i = p

因为 i 是您将在数组 A 中查找的第一个元素。

2- TEMP数组大小的初始化值错误,应该是:

(r - p + 1)

3- 填充 TEMP 数组和/或替换 A 数组元素似乎有错误,这里是固定代码。我在第一个 while 循环之后写了一条关于该部分的评论,以说明此时需要做什么。

def mergeSort(A,p,r): 
    if p < r:
        q = (p+r)//2
        mergeSort(A,p,q)
        mergeSort(A,q+1,r)
        Merge(A,p,q,r)

def Merge(A,p,q,r):
    i = p
    j = q+1
    k=0
    
    
    TEMP =  [0]*(r - p + 1)

    while i <= q and j <= r:
        if A[i] <= A[j]:
            TEMP[k] = A[i]
            k += 1
            i += 1
        else:  
            TEMP[k] = A[j] 
            k += 1
            j += 1
    
    """
        There are currently 2 cases
    1- i > q, means we exhausted left but there are elements in the right
    2- j > r, means we exhausted right but there are elements in the left
    """
    if (j > r):
        #  copy elements at the left side to temp
        while (i <= q):
            TEMP[k] = A[i]
            i += 1
            k += 1
    else:
        #  copy elements at the right side to temp
        while (j <= r):
            TEMP[k] = A[j]
            j += 1
            k += 1
    
    
    #  replace elements in A with elements in TEMP
    for t in range(k):
        A[p+t] = TEMP[t]



A = [15,16,13,10,19,18]
mergeSort(A,0,len(A)-1)
print(A)

【讨论】:

    【解决方案2】:

    错误在于Merge()函数。

    1. 初始化i=p 而不是i=1
    2. while 循环终止后,i&lt;qj&lt;r 有可能出现。我们也需要适应这些情况。
    3. 数组TEMP 的大小不正确。
      更正合并功能:
    def Merge(A,p,q,r):
        i = p
        j = q+1
        k=0
        TEMP =  [0]*(r-p+1)
        
        while i <= q and j <= r:
            if A[i] <= A[j]:
                TEMP[k] = A[i]
                k += 1
                i += 1
            else:  
                TEMP[k] = A[j] 
                k += 1
                j += 1
        while i<=q:
            TEMP[k] = A[i]
            k+=1 
            i += 1
        while j<=r:
            TEMP[k] = A[j]
            k+=1 
            j += 1
    
        for t in range (p,r+1):
           A[t] = TEMP[t-p]
    

    注意:请尝试使用更有意义的变量名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-19
      • 2021-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多