1.归并排序
思路: 逐步把一个序列拆分,每次拆一半,直到拆成n个元素的序列,拆完之后开始合并,两个两个合并,合并完 之后再四个一组合并,依次合并为原来长度的序列;
整个过程使用递归
2. 代码实现
def merge_sort(L): """归并排序""" if len(L)==1: return L mid=len(L)//2 left_list=merge_sort(L[:mid]) right_list=merge_sort(L[mid:]) left_pointer,right_pointer=0,0 result=[] while left_pointer<len(left_list) and right_pointer<=len(right_list): if left_list[left_pointer]<right_list[right_pointer]: result.append(left_list[left_pointer]) left_pointer+=1 else: result.append(right_list[right_pointer]) right_pointer+=1 result+=left_list[left_pointer:] result+=right_list[right_pointer:] return result L=[5,2,8,3,7,1,9,4] L_sorted=merge_sort(L) print(L) print(L_sorted)
运行结果:
3. 时间复杂度
归并排序时间复杂度 nlog(n) 拆分之后合并的过程,横向复杂度n (因为总共需要比较n个元素);
纵向时间复杂度是log(n)因为从n个元素的序列逐步合并,最终合并为一个大的序列 2^k=n 合并的过程总共有log(n)次
所以归并排序的时间复杂度 nlog(n)
4. 稳定性
归并排序是稳定的;