算法思想:
将待排序序列R[0...n-1]看成是n个长度为1的有序序列,将相邻的有序表成对归并,得到n/2个长度为2的有序表;将这些有序序列再次归并,得到n/4个长度为4的有序序列;如此反复进行下去,最后得到一个长度为n的有序序列。
实现步骤:
- “分解”——将序列每次折半划分。
-
“合并”——将划分后的序列段两两合并后排序。
图示:
代码实现
def get_number(num): import random lst = [] i = 0 while i < num: lst.append(random.randint(0,100)) i += 1 return lst def merge(left,right): i,j = 0,0 result = [] while i < len(left) and j < len(right): if left[i] <= right[j]: result.append(left[i]) i += 1 else: result.append(right[j]) j += 1 result += left[i:] result += right[j:] return result def mergesort(lst): if len(lst) <=1: return lst num = len(lst) // 2 # 取整数部分 left = mergesort(lst[:num]) right = mergesort(lst[num:]) return merge(left,right) a = get_number(10) print("排序之前:",a) b = mergesort(a) print("排序之后:",b) #####输出结果########## 排序之前: [23, 29, 8, 91, 85, 93, 39, 81, 24, 15] 排序之后: [8, 15, 23, 24, 29, 39, 81, 85, 91, 93]
性能分析
时间复杂度:归并排序的形式就是一棵二叉树,它需要遍历的次数就是二叉树的深度,而根据完全二叉树的可以得出它的时间复杂度是O(n*log2n)
空间复杂度:由前面的算法说明可知,算法处理过程中,需要一个大小为n的临时存储空间用以保存合并序列。
算法稳定性:在归并排序中,相等的元素的顺序不会改变,所以它是稳定的算法。
排序效果