归并排序

淺唱寂寞╮ 提交于 2020-02-27 10:50:55

时间复杂度O(nlogn),但是空间复杂度O(n).

算法

递归的将前半部分数据和后半部分数据各自归并排序

1.申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列。
2.设定两个指针left[0]和right[0],最初位置分别为两个已经排序序列的起始位置。
3.比较两个指针所指向的元素,选择相对小的元素pop出来,append到合并空间,并移动指针到下一位置(因为用了pop函数,所以下一位置是新的left[0或right[0]).
4.重复步骤 3 直到某一指针达到序列尾,将另一序列剩下的所有元素直接复制到合并序列尾。

算法分析

采用了经典的分治策略,它将问题分成一些小的问题然后递归求解,而治的阶段则将分的阶段解得的各个答案修补到一起。

图解

在这里插入图片描述

代码

这里我们定义两个函数,一个用于递归的进行排序,另一个用于合并两个已经排序的部分。

import math         #用到math.floor函数 向下取整
def mergesort(arr):        #递归的拆分排序
    if len(arr)<2:
        return arr
    mid=math.floor(len(arr)/2)
    left=arr[0:mid]
    right=arr[mid:]
    a=mergesort(left)
    b=mergesort(right)
    return merge(a,b)

def merge(left,right):      #用于合并已排序数组
    re=[]
    while left and right:
        if left[0]<=right[0]:
            re.append(left.pop(0))
        else:
            re.append(right.pop(0))
    while left:
        re.append(left.pop(0))
    while right:
        re.append(right.pop(0))
    return re


#实例化
array=[3,4,23,64,423,2,342,5353]
print(mergesort(array))

输出:

[2, 3, 4, 23, 64, 342, 423, 5353]
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!