数据结构与算法(python版)(十三)
1、归并排序
归并排序是采用分治法的一个非常典型的应用,归并排序的思想就是先递归分解数组,再合并数组。将数组分解最小之后,然后合并两个有序数组,基本思路是比较两个数组的最前面的数,谁小就先取谁,取了后相应的指针就往后移一步,再比较,直至一个数组为空,最后把另一个数组的剩余部分复制过来即可。
2、归并排序的实现
#关键代码
#while left_pointer < len(left_li) and right_pointer < len(right_li):
# if left_li[left_pointer] < right_li[right_pointer]:
# result.append(left_li[left_pointer])
# left_pointer += 1
# else:
# result.append(right[pointer])
# right_pointer +=1
#
# result += left_li[left_pointer:]
# result += right_li[right_pointer]
#
# return result
def merge_sort(alist):
#归并排序
#首先对列表元素进行拆分
n = len(alist)
if n <= 1:
#嵌套到只有一个元素停止,直接返回
return alist
mid = n // 2
#left_li和right_li代表经过归并排序后形成的新的有序列表
#递归调用会使列表一种拆分至只含一个元素(此时为最深层),然后再一层一层往上运算
left_li = merge_sort(alist[:mid])
right_li = merge_sort(alist[mid:])
#对某层中的left_li和right_li进行排序
left_pointer, right_pointer = 0, 0
result = []
while left_pointer < len(left_li) and right_pointer < len(right_li):
if left_li[left_pointer] < right_li[right_pointer]:
result.append(left_li[left_pointer])
left_pointer += 1
else:
result.append(right_li[right_pointer])
right_pointer += 1
result += left_li[left_pointer:]
result += right_li[right_pointer:]
return result
if __name__ == '__main__':
li = [54, 26, 93, 17, 77, 31, 44, 55, 20]
print(li)
sorted_li = merge_sort(li)
print(sorted_li)
3、时间复杂度
最优时间复杂度:O( n l o g ( n ) nlog(n) nlog(n))
最坏时间复杂度:O( n l o g ( n ) nlog(n) nlog(n))
稳定