from timeit import Timer
def back_sort(lis):
n= len(lis)
if n == 1:
return (lis)
mid = n//2
left_sorted = back_sort(lis[:mid])
right_sorted = back_sort(lis[mid:])
n_left = len(left_sorted)
n_right = len(right_sorted)
left_start = 0
right_start = 0
merged_lis = []
while left_start < n_left and right_start <n_right:
if left_sorted[left_start] <= right_sorted[right_start]:
merged_lis.append(left_sorted[left_start])
left_start += 1
else:
merged_lis.append(right_sorted[right_start])
right_start += 1
merged_lis += left_sorted[left_start:]
merged_lis += right_sorted[right_start:]
return merged_lis
def merge_sort(lis,start,end):
if start == end:
return [lis[start]]
mid = (start+end)//2
right_sorted = merge_sort(lis,mid+1,end)
left_sorted = merge_sort(lis,start,mid)
n_left = len(left_sorted)
n_right = len(right_sorted)
left_start = 0
right_start = 0
merged_lis = []
while left_start < n_left and right_start <n_right:
if left_sorted[left_start] <= right_sorted[right_start]:
merged_lis.append(left_sorted[left_start])
left_start += 1
else:
merged_lis.append(right_sorted[right_start])
right_start += 1
merged_lis += left_sorted[left_start:]
merged_lis += right_sorted[right_start:]
return merged_lis
if __name__ == "__main__":
lis = [49,38,65,97,76,13,27,49]
n = len(lis)-1
print(back_sort(lis))
print(merge_sort(lis,0,n))
t1 = Timer('back_sort(%s)'%lis, 'from __main__ import back_sort')
t2 = Timer('merge_sort(%s,%s,%s)'%(lis,0,n), 'from __main__ import merge_sort')
#t1 = Timer('back_sort(lis)', 'from __main__ import back_sort;lis=[49,38,65,97,76,13,27,49]')
#t2 = Timer('merge_sort(lis,start,end)', 'from __main__ import merge_sort;lis=[49,38,65,97,76,13,27,49];start = 0; end = len(lis)-1')
print(t1.timeit(number=1000))
print(t2.timeit(number=1000))
注:
1)向Timer 函数里面传入参数时,如果变量定义在外面,那么要用
t1 = Timer(‘back_sort(%s)’%lis, ‘from main import back_sort’)
t2 = Timer(‘merge_sort(%s,%s,%s)’%(lis,0,n), ‘from main import merge_sort’)
的方式引入。不然系统会提示xxx为定义。这是我踩过的坑,多亏站内小伙伴提点,在这里记录一下以后就不会再犯了。
2)还有第二种方式,就是把参数写在内部,语句之间用分号隔开
t1 = Timer(‘back_sort(lis)’, ‘from main import back_sort;lis=[49,38,65,97,76,13,27,49]’)
t2 = Timer(‘merge_sort(lis,start,end)’, ‘from main import merge_sort;lis=[49,38,65,97,76,13,27,49];start = 0; end = len(lis)-1’)