归并排序

分治策略

分治算法应该算是目前最著名的算法设计技术了,很多高效的算法都是分治法或分治法的稍加改进。分治法可以通俗的解释为:把一片领土分解,分解为若干块小部分,然后一块块地占领征服,被分解的可以是不同的政治派别或是其他什么,然后让他们彼此异化。

分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。


分治法所能解决的问题一般具有以下几个特征:

  1. 该问题的规模缩小到一定的程度就可以容易地解决
  2. 该问题可以分解为若干个规模较小的相同问题,即该问题具有最 优子结构性质。
  3. 利用该问题分解出的子问题的解可以合并为该问题的解;
  4. 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。

归并排序

归并排序便是一个完美的利用分治法解决问题的例子。我们已经学习过了选择排序和冒泡排序,不知大家有没有觉得这两个算法写起来的感觉很像(没错,都是两重for循环,哈哈哈),今天的归并排序会让你有不一样的感觉。

归并操作的工作原理如下:

第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置
第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤三直到某一指针超出序列尾

将另一序列剩下的所有元素直接复制到合并序列尾

归并排序的python实现


def Merge(a1,a2):
    result=[]
    while len(a1)>0 and len(a2)>0:
        if a1[0]<= a2[0]:
            result.append(a1.pop(0))
        else:
            result.append(a2.pop(0))
    result += a1
    result += a2
    return result

def MergeSort(slist):
    if len(slist) == 1:
        return slist
    mid = len(slist)//2
    left = slist[:mid]
    right = slist[mid:]
    l=MergeSort(left)
    r=MergeSort(right)
    return Merge(l,r)

欢迎关注公众号 : 数学算法实验室
算法与人工智能领域

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值