簡體   English   中英

python中的merge_sort

[英]merge_sort in python

我是python的新手,正在嘗試在Python中實現merge_sort,這是我的代碼。 但是它陷入無限循環。 誰能指出原因? 謝謝

def merge_sort(a):
    '''implement merge sort for array'''
    l = len(a)
    if l == 1:
        return a[0]
    a1 = merge_sort(a[:l/2-1])
    a2 = merge_sort(a[l/2:-1])
    a_sort = []
    idx1, idx2 = 0, 0
    #for i in range(l):
    if idx1 == len(a1):
        a_sort.append(a2[idx2:])
        import ipdb; ipdb.set_trace()
        return a_sort
    elif idx2 == len(a2):
        a_sort.append(a1[idx1:])
        return a_sort
    else:      
        if a1[idx1] >= a2[idx2]:
            a_sort.append(a2[idx2])
            idx2 += 1
        else:
            a_sort.append(a1[idx1])
            idx1 += 1

問題是,當遞歸下降到一個空列表(即l == 0 )時,在返回任何內容之前,調用了merge_sort([])兩次。 您需要添加一個檢查, if l == 0: return []

同樣,檢查if l == 1: return a[0]有點錯誤; merge_sort應該始終返回一個列表,而這將返回一個列表元素(數字或字符串等)。 所以可能應該是

if l <= 1:
    return a

另外,您的a2實際上不包括數組的最后一個元素:您想要a[l/2:] ,而不是a[l/2:-1] (請記住,Python中的范圍包含最后一個元素。)

這不會影響代碼的正確性,但是您應該使用l // 2來表示整數除法。 在Python3中,或者如果您是from __future__ import division ,則當l為奇數時, l/2將為浮點數。

正如Dougal和Andrei指出的那樣,無限循環是由未經檢查的邊緣條件引起的。 if l == 1:替換行if l == 1: if l < 2:替換行。
代碼中還有其他問題:

  • 位置l/2處列表a的左部分和右部分分別對應a[:l/2]a[l/2:] 不需要減1。只要認為一個位置在兩個項目之間即可。
  • ifelif分支中使用.extend()而不是append()
  • 別忘了找回注釋掉的forloop。
  • 最后沒有return

而且通常while結構更方便

while idx1 < len(a1) and idx2 < len(a2):
    'code in your else branch'    
if idx1 < len(a1):
    a_sort.extend(a1[idx1:])
else:
    a_sort.extend(a2[idx2:])
return a_sort

謝謝! 工作代碼如下

def merge_sort(a):
'''implement merge sort for array'''
l = len(a)
if l == 1:
    return a
a1 = merge_sort(a[:l//2])
a2 = merge_sort(a[l//2:])
a_sort = []
idx1, idx2 = 0, 0
while idx1 < len(a1) and idx2 < len(a2):
    if a1[idx1] >= a2[idx2]:
        a_sort.append(a2[idx2])
        idx2 += 1
    else:
        a_sort.append(a1[idx1])
        idx1 += 1
if idx1 < len(a1):
    a_sort.extend(a1[idx1:])
else:
    a_sort.extend(a2[idx2:])
return a_sort 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM