1 回答

TA貢獻1827條經驗 獲得超8個贊
您的索引版本使用了令人困惑的約定,其中left是切片中第一個元素的索引,right也是最后一個元素的索引。這個約定需要容易出錯+1/-1調整。你的問題是這樣的:mid計算出來的是左半部分最后一個元素的索引,但你認為它mid是右半部分的第一個元素:2個元素的切片被分成一個帶有0的元素和一個帶有2的元素,因此無限遞歸。您可以通過更改ms(x, mid, right+1)為ms(x, mid+1, right)等來解決此問題。
此外,m從功能中恢復ms是沒有意義的。x如果有什么的話你應該回來。
right將索引設置為最后一個元素之后的索引更不容易出錯,就像 Python 中的范圍說明符一樣。這樣就不會有混亂+1/-1調整。
這是修改后的版本:
def ms(x, left, right):
# the base case: right - left as a single-element array
if right - left >= 2:
mid = (left + right) // 2 # index of the first element of the right half
ms(x, left, mid)
ms(x, mid, right)
m(x, left, mid, right)
return x
def m(x, left, mid, right):
nlower = mid - left
nupper = right - mid
temp = [0] * (nlower + nupper)
ilower, iupper, k = left, mid, 0
while ilower < mid and iupper < right:
if x[ilower] <= x[iupper]:
temp[k] = x[ilower]
ilower += 1
k += 1
else:
temp[k] = x[iupper]
iupper += 1
k += 1
if ilower == mid:
temp[k:] = x[iupper:right]
else:
temp[k:] = x[ilower:mid]
x[left:right] = temp
return x
您將調用為:
x = random.sample(range(0, 30), 15)
ms(x, 0, len(x))
添加回答
舉報