繁体   English   中英

python的合并排序

[英]Merge sort for python

这是我的mergemerge mergeSort功能。 merge合并两个单独的数组并mergesSort排序并使用递归合并它们:

def merge(arrL, arrR):
    arrNew = []
    d = len(arrL) + len(arrR)
    i = 0
    j = 0
    for k in range (0, d-1):
        if (arrL[i] < arrR[j]) :
            arrNew.append(arrL[i]) # appends to the end of the array
            i = i + 1
        else:
            arrNew.append(arrR[j])
            j = j + 1
    return arrNew

def mergeSort(arr, m, n):
    if (n - m == 1):
        return arr[m]
    else:
        p = (m + n) // 2
        arrL = mergeSort(arr, m, p)
        arrR = mergeSort(arr, p, n)
        arrNew = merge(arrL, arrR)
        return arrNew

我在第 32、33 和 13 行收到错误消息:

d = len(arrL) + len(arrR)
TypeError: object of type 'int' has no len()

是什么导致了这个错误? 合并将两个数组作为输入。

是什么导致了这个错误? merge将两个数组作为输入。

除非它没有。

if(n-m == 1):
  return arr[m]

mergeSort这个输出不是一个数组。

我猜是这条线

if(n-m == 1):
    return arr[m]

这大概是返回数组的内容arr[m]而不是数组本身。

由于您的代码对数组进行排序,当这个裸元素被递归时,它会产生您看到的错误。

代码中存在多个问题:

  • mergeSort ,当数组的长度小于 2 时,您应该返回arr而不是arr[m] 。测试if (n - m == 1)不允许空数组:

     if (n - m < 2): return arr
  • merge ,主循环应该运行d次,即:而不是for k in range (0, d-1):你应该写:

     for k in range (d):
  • 合并循环中的测试还应检查索引值是否仍在范围内。 如果第二个切片用完,则应选择元素arrL[i]

     for k in range (d): if i < len(arrL) and (j >= len(arrR) or arrL[i] < arrR[j]): arrNew.append(arrL[i]) i = i + 1 else: arrNew.append(arrR[j]) j = j + 1

这是一个修改后的版本:

def merge(arrL, arrR):
    arrNew = []
    i = 0
    j = 0
    for k in range(len(arrL) + len(arrR)):
        if i < len(arrL) and (j >= len(arrR) or arrL[i] < arrR[j]):
            arrNew.append(arrL[i])
            i = i + 1
        else:
            arrNew.append(arrR[j])
            j = j + 1
    return arrNew

def mergeSort(arr, m, n):
    if (n - m < 2):
        return arr
    else:
        p = (m + n) // 2
        arrL = mergeSort(arr, m, p)
        arrR = mergeSort(arr, p, n)
        return merge(arrL, arrR)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM