##时间复杂度O(nlogn)
目录
##递归实现归并排序
##原理
是一种基于分治策略的基础排序算法。
1.划分阶段:通过不断递归地将数组从中点处分开,将长数组的排序问题转化成段数组的排序问题。
2.合并阶段:当子数组的长度为1时终止划分,开始合并,持续不断地将左右两个较短的有序数组合并为一个较长的有序数组,直到结束。
##图例
##代码实现
1.向下递归,对半分割
2.递归返回条件:递归到最小,1个就是有序【控制的是范围,归并的是区间】
3.递归到最深处,最小时,就递归回去,开始分割按对半分割出的范围,将已有子序列合并,在tmp里面进行合并
4.再将tmp里形成的有序序列,拷贝回原数组【因下一次递归回去上一层的归并过程中,会将数据在tmp中进行归并,会将tmp中的数据覆盖,因此要及时,拷】
//python代码示例 def Merge(a, start, mid, end) : tmp = [] #创建一个临时列表,用来存储合并的值 #两段起点的开始 l = start r = mid + 1 #当两段都没到达末尾,则继续循环,将其添加到tmp while l <= mid and r <= end : if a[l] <= a[r] : tmp.append(a[l]) l += 1 else : tmp.append(a[r]) r += 1 #此时肯定只剩下,单一的一个值,即将剩余元素塞入到tmp中 tmp.extend(a[l:mid+1]) tmp.extend(a[r:end+1]) #将合并完成的元素,赋值到a原数组中 for i in range(start,end+1): a[i] = tmp[i - start] print(start,end,tmp) def MergeSort(a,start,end) : #利用递归来实现归并排序,将大的问题分解成小的子问题 if start == end : #当递归到数组只有一个元素时,直接返回 return mid = (start + end) // 2 #计算出mid,找到递归点 MergeSort(a,start,mid) #左递归 MergeSort(a,mid+1,end) #右递归 Merge(a,start,mid,end) #左递归,左合并,右递归,右合并,类似于树的后序遍历 a = [7,3,2,6] MergeSort(a,0,3)