def merge_sort(a):
if len(a)<=1:
return a
left = merge_sort(a[:len(a)//2])
//print('this is left step {}'.format(left))
right = merge_sort(a[len(a)//2:])
//print('this is right step {}'.format(right))
return merge(left, right)
我明白代数递归函数,我明白它是如何工作的。
我不明白的是如何 merge_sort(a[len(a)//2:])
从传入的名为'a'的列表中只得到一个数字(我有一个def create_random_array传入随机数字列表)。
我的想法是,它将首先把列表一分为二--我可以在我的打印函数中看到,然后它将再次将其分割,再分割,直到只有一个可以比较的数字。
如何 merge_sort(a[len(a)//2:])
工作
其他部分的代码,可能对理解我的混乱有所帮助。
def create_array(size = 5, max = 10):
from random import randint
return [randint(0,max) for _ in range(size)]
def merge(a,b):
c = []
a_idx = 0
b_idx = 0
print(a[a_idx])
print(b[b_idx])
while a_idx<len(a) and b_idx<len(b):
if a[a_idx]<b[b_idx]:
c.append(a[a_idx])
a_idx+=1
else:
c.append(b[b_idx])
b_idx+=1
if a_idx==len(a):
c.extend(b[b_idx:])
else:
c.extend(a[a_idx:])
return c
.......然后它将再次拆分,再拆分,直到只有一个可以比较。
是的,因为在某些时候,在将你的列表减半(再减半,再减半......)之后,它将调用 merge_sort
只有一个项目的列表。
而该函数做的第一件事就是这样。
def merge_sort(a):
if len(a)<=1:
return a
就是说,一个只有一个项目的列表被原样返回(而不是减半)。