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))
添加回答
举报