归并算法理解
假设有一个序列:
merge_sort: 54 26 93 17 77 31 44 55
对半拆分,拆到每个部分的都只有一个元素:
54 26 93 17 | 77 31 44 55
54 26 | 93 17 | 77 31 | 44 55
54 | 26 | 93 | 17 | 77 |31 | 44 | 55
进行合并。合并后小的在前,大的在后
26 54 | 17 93 | 31 77 | 44 55
26 54 | 17 93 | 31 77 | 44 55
26 54 | 17 93
然后检查左右两边,分别从左往右比较,先比较26和17,17小就将17放在第一个位置,然后把指针指向93,比较26和93, 26小就将26放在第二个位置,把左侧的指针后移指向54,然后比较54和93,54小就将54放在第三个位置,93放在第四个位置。得到排序后的结果。
17 26 54 93 | 31 44 55 77
合并后再重复上个步骤
17 26 31 44 54 55 77 93
代码实现
def merge_sort(alist):
n = len(alist)
if n<=1:
return alist
mid = n//2
left_lst = merge_sort(alist[:mid])
right_lst = merge_sort(alist[mid:])
left_pointer, right_pointer = 0, 0
result = []
while left_pointer < len(left_pointer) and right_pointer < len(right_pointer):
if left_lst[left_pointer] < right_lst[right_pointer]:
result.append(left_lst[left_pointer])
left_pointer += 1
else:
result.append(left_lst[right_pointer])
right_pointer += 1
result += left_lst[left_pointer:]
result += right_lst[right_pointer:]
return result
时间复杂度
最坏时间复杂度 O(nlogn)
最优时间复杂度 O(nlogn)
稳定性:稳定