归并排序算法是一个稳定的算法:所谓稳定的意思就是列表中相同元素的先后顺序在排序前后不变。其速度仅次于快排。一般用于对总体无序,但是各子项相对有序的列表。时间复杂度为O(nlogn),空间复杂度为O(n)
归并排序的宗旨为:将元素分组,组内排序,排完合并,例如,将列表中两两分为一组,组内排序,待排好之后,再将两两合并,变为四个四个一组,然后排序,直到所有元素合为一组。
难点在于:如何合并:合并这里用到了指针操作,用两个指针分别指向需要合并的list1和list2,如果指针1的元素小于指针2的元素,则将该元素存入返回值,指针1后移,如果指针2的元素比较小,则将该元素存入返回值,指针2后移,知道某list的元素都遍历完,将另外一个list的元素直接加到返回值的最后。代码如下:
def merge_sort(nums):
if len(nums)<=1:
return nums
k=len(nums)//2
left=merge_sort(nums[:k])
right=merge_sort(nums[k:])
return merge(left,right)
def merge(left,right):
i,j=0,0
res=[]
while i<len(left) and j<len(right):
if left[i]<=right[j]:
res.append(left[i])
i=i+1
else:
res.append(right[j])
j=j+1
res+=left[i:]
res+=right[j:]
return res