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

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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

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

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

    人工智能你必须掌握的32个算法(二)归并排序算法_第1张图片

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

人工智能你必须掌握的32个算法(二)归并排序算法_第2张图片

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

人工智能你必须掌握的32个算法(二)归并排序算法_第3张图片

代码实现:

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

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