簡體   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