九大排序算法之归并排序

归并排序(Merge Sort)

        归并排序是采用分治法的一个非常典型的应用。归并排序的思想就是先递分解数组,再并数组。归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。

原理:

        先考虑合并两个有序数组,基本思路是比较两个数组的最前面的数,谁小就先取谁,取了后相应的指针就往后移一位。然后再比较,直至一个数组为空,最后把另一个数组的剩余部分复制过来即可。

         再考虑递归分解,基本思路是将数组分解成leftright,如果这两个数组内部数据是有序的,那么就可以用上面合并数组的方法将这两个数组合并排序。如何让这两个数组内部是有序的?可以再二分,直至分解出的小组只含有一个元素时为止,此时认为该小组内部已有序。然后合并排序相邻二个小组即可。

算法详细描述:

  • 把长度为n的输入序列分成两个长度为n/2的子序列;
  • 对这两个子序列分别采用归并排序;
  • 将两个排序好的子序列合并成一个最终的排序序列。

动图演示:

代码实现:

def merge(left, right):
    '''合并操作
       将两个有序数组left[]和right[]合并成一个大的有序数组
    '''
    l, r = 0, 0
    result = []
    while l < len(left) and r < len(right):
        if left[l] < right[r]:
            result.append(left[l])
            l += 1
        else:
            result.append(right[r])
            r += 1
    result += left[l:]
    result += right[r:]
    return result


def mergeSort(arr):
    if len(arr) <= 1: return arr
    num = int(len(arr) / 2)     #二分分解
    left = mergeSort(arr[:num])
    right = mergeSort(arr[num:])
    return merge(left, right)   #合并数组

时间复杂度、空间复杂度及稳定性:

        归并排序是一种稳定的排序方法。和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是O(nlogn)的时间复杂度。代价是需要额外的内存空间。

猜你喜欢

转载自blog.csdn.net/qq_30123335/article/details/83214179
今日推荐