标签:ret 位置 出栈 分而治之 思想 数组 总结 复杂度 有序表
归并排序使用了二分法,归根到底的思想还是分而治之。拿到一个长数组,将其不停的分为左边和右边两份,然后以此递归分下去。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并排序是一种稳定的排序方法。具体逻辑实现如下:
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
归并排序本身是非常类似于快速排序的一种算法,可以将归并排序和快速排序放在一起记忆。
标签:ret 位置 出栈 分而治之 思想 数组 总结 复杂度 有序表
原文地址:https://www.cnblogs.com/hyj691001/p/12013419.html