算法学习笔记(5.0)-基于比较的高效排序算法-归并排序

##时间复杂度O(nlogn)

目录

##时间复杂度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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值