人工智能你必须掌握的32个算法(二)归并排序算法

    归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

    归并排序通过将已有序的子序列合并,得到完全有序的序列。那么我们如何将一个无序的序列拆分成有序子序列呢?

    归并排序的核心是分治,对于一个无序序列A,假设将序列A拆分成两个序列A1、A2,我们无法保证A1、A2有序,然后我们继续将A1、A2序列继续分解成A11、A12、A21、A22,直至每个序列中只有一个元素,如此即可保证每个子序列有序了。该步骤即“”。

    7729e533379b126d2657165966e146733e3.jpg

     好了,我们已经得到N个(数据长度个)有序子序列了,下面该进行到“”的步骤了。对于每两个有序子序列,我们将起两两合并。

f99737770426a17777c947b9420426b1b1a.jpg

    对于任意两个需要合并的子序列,将先用每个序列第一个元素进行比较,将较小元素放入新序列,然后将已放入新序列的子序列第二个元素和另一个序列第一个元素进行比较,直至两个序列所有数全部加入新序列为止。

a325fa7065334063d93e03e02b4c300d430.jpg

代码实现:

def sort(oldArray):
    if len(oldArray) == 1:
        return oldArray
    midd = len(oldArray)//2
    oldArray1 = sort(oldArray[:midd])
    oldArray2 = sort(oldArray[midd:])
    return merge(oldArray1, oldArray2)


def merge(oldArray1, oldArray2):
    newArray = []
    i = 0
    j = 0
    while i < len(oldArray1) and j < len(oldArray2):
        if oldArray1[i] <= oldArray2[j]:
            newArray.append(oldArray1[i])
            i += 1
        else:
            newArray.append(oldArray2[j])
            j += 1
    newArray += oldArray1[i:]  # 将两个数组剩余元素加入新数组
    newArray += oldArray2[j:]
    return newArray

print(sort([12, 67, 5, 62, 94, 22, 56]))

 

转载于:https://my.oschina.net/mutoushirana/blog/1854644

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值