[英]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。只要認為一個位置在兩個項目之間即可。 if
和elif
分支中使用.extend()
而不是append()
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.