函数merge()工作正常,但merge_sort没有,ls和rs的值在使用merge_sort()后没有改变。请帮助弄清楚出了什么问题,我已经坚持了几个小时。
def merge_sort(arr):
def merge(sub_arr,p,q):
L = []
R = []
for i in range(p):
L.append(sub_arr[i])
#print L
for i in range(q-p):
R.append(sub_arr[p+i])
#print R
L.append('n')
R.append('n')
j=k=0
for i in range(q):
if L[j] < R[k] :
sub_arr[i] = L[j]
j += 1
else:
sub_arr[i] = R[k]
k += 1
if len(arr) > 1 :
ls = arr[:len(arr)/2]
rs = arr[len(arr)/2:]
merge_sort(ls)
#print ls
merge_sort(rs)
#print rs
arr = ls + rs
#print arr
merge (arr,len(arr)/2,len(arr))
#print arr
x = map(int,raw_input('Enter sequence:').strip().split())
merge_sort(x)
print x
答案 0 :(得分:0)
问题在于行
arr = ls + rs
您不再在传递给merge_sort的列表上调用merge,而是在副本上调用它。所以原始列表没有被修改。要解决此问题,您最后可以使用merge_sort
函数return arr
,然后分配ls = merge_sort(ls)
(以及rs
的类似内容)。完成后,您的代码应该可以正常工作。
正确的版本在这里..
def merge_sort(arr):
def merge(sub_arr,p,q):
L = []
R = []
for i in range(p):
L.append(sub_arr[i])
for i in range(q-p):
R.append(sub_arr[p+i])
L.append('n')
R.append('n')
j=k=0
for i in range(q):
if L[j] < R[k] :
sub_arr[i] = L[j]
j += 1
else:
sub_arr[i] = R[k]
k += 1
if len(arr) > 1 :
ls = arr[:len(arr)/2]
rs = arr[len(arr)/2:]
ls = merge_sort(ls)
rs = merge_sort(rs)
arr = ls + rs
merge (arr,len(arr)/2,len(arr))
return arr
这给出了预期的结果
>>> x = map(int,raw_input('Enter sequence:').strip().split())
Enter sequence:4 5 2 1 3 4 6
>>> y = merge_sort(x)
>>> print x
[4, 5, 2, 1, 3, 4, 6]
>>> print y
[1, 2, 3, 4, 4, 5, 6]