seekerhit 2019-12-09
归并排序使用了二分法,归根到底的思想还是分而治之。拿到一个长数组,将其不停的分为左边和右边两份,然后以此递归分下去。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并排序是一种稳定的排序方法。具体逻辑实现如下:
a) 同时对两个数组的第一个位置进行比大小,将小的放入一个空数组,然后被放入空数组的那个位置的坐标往后移一个
b) 然后继续和另外一个数组的上一个位置进行比较,以此类推
c) 到最后任何一个数组先出栈完,就将另外i一个数组里的所有元素追加到新数组后面
def Merge(arr_a,arr_b):
"""合并arr_a和arr_b2个有序数组"""
i = j = 0
res = []
while i<len(arr_a) and j<len(arr_b):
if arr_a[i] <= arr_b[j]:
res.append(arr_a[i])
i+=1
else:
res.append(arr_b[j])
j+=1
if i == len(arr_a):
res.extend(arr_b[j:])
else:
res.extend(arr_a[i:])
return res
def MergeSort(arr):
"""拆分数组为有序数组"""
mid = len(arr)//2
if len(arr)<=1:
return arr
left = MergeSort(arr[:mid])
right = MergeSort(arr[mid:])
return Merge(left,right)
arr = [93,28,1,1,99,98,199,0]
print(MergeSort(arr))先将数组进行拆分为有序数组,然后再合并2个有序数组,排序过程类似于快速排序。
由于递归拆分的时间复杂度是logN 然而,进行两个有序数组排序的方法复杂度是N该算法的时间复杂度是N*logN 所以是NlogN
归并排序本身是非常类似于快速排序的一种算法,可以将归并排序和快速排序放在一起记忆。
排序是将一串数据按照其某个或者某些关键字的大小进行递增或递减排列的操作我,通常指的排序是升序,排序方式是原地排序。即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并