归并排序是由冯诺依曼首次提出,该算法采取的是分而治之(Divide and Conquer)的思想,速度仅次于快速排序且为稳定算法,适合的排序情况为总体无序,而各子集相对有序。
原理:其思想就是分而治之,具体来讲就是把原序列不断分解为子序列,直到子序列只有一个元素为止,然后再将各个子序列进行有序归并直到序列数为一。

从上图就可以看出归并算法的流程:
- 将原始序列分为2个子序列
- 再将2个子序列分成4个子序列
- 直到每个子序列中只有1个元素
- 然后进行归并操作,并排序,不断重复直到只有一个序列为止
代码实现
#递归实现
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,根据主定理时间复杂度为o(
)=o(nlogn)
归并排序采用分而治之的策略,由冯诺依曼提出,是一种稳定的排序算法。它将序列不断分解直至只剩单一元素,再有序归并。算法流程包括序列分解、子序列归并,最终形成有序序列。Python3.7的代码实现展示了这一过程。通过对递归形式的分析,得出时间复杂度为O(nlogn)。

1019

被折叠的 条评论
为什么被折叠?



