归并算法Python3.7实现及时间复杂度分析

归并排序是由冯诺依曼首次提出,该算法采取的是分而治之(Divide and Conquer)的思想,速度仅次于快速排序且为稳定算法,适合的排序情况为总体无序,而各子集相对有序。

原理:其思想就是分而治之,具体来讲就是把原序列不断分解为子序列,直到子序列只有一个元素为止,然后再将各个子序列进行有序归并直到序列数为一。

归并算法Python3.7实现及时间复杂度分析_第1张图片

从上图就可以看出归并算法的流程:

  1. 将原始序列分为2个子序列
  2. 再将2个子序列分成4个子序列
  3. 直到每个子序列中只有1个元素
  4. 然后进行归并操作,并排序,不断重复直到只有一个序列为止

代码实现

#递归实现
def merge(left,right,s): #传入左序列和右序列还有原序列
    i = j = 0
    while i + j < len(s): #原序列的作用为控制循环次数
        if (j == len(right)) or (i < len(left) and left[i] < right[j]): #如果右边的序列走完了或左边的序列[i]的值小于右边序列[j]的值 则将左边[i]的值保存到s序列
            s[i+j] = left[i]
            i += 1
        else: #不然将右边序列[j]的值保存到s序列
            s[i+j] = right[j]
            j += 1

def merge_sort(s): #归并实现
    n = len(s) 
    if n < 2: #如果n=1或者n=0则返回
        return

    mid = n // 2 #进行划分
    left = s[0:mid] 
    right = s[mid:n]

    merge_sort(left) #这里是递归实现
    merge_sort(right)
    merge(left,right,s)

if __name__ == '__main__':
    s = [1,7,4,8,5,9]
    merge_sort(s)
    print(s)

时间复杂度分析

首先分析归并算法的递归形式,也就是找出T(n)和n之间的关系,通过上述流程不难得出表达式T(n)=2*T(n/2)+n,2*T(n/2)中的2代表的是有2次这样的操作,而T(n/2)代表的是划分为2个序列,n代表的是最后最多要进行n次比较。写出递归形式之后,利用主定理,这里b = a = 2,f(n) = n = n\log_ba,根据主定理时间复杂度为o(n\log_ba\log_2n)=o(nlogn)

你可能感兴趣的:(Python编程)