使用合并排序法为应该数列排序时,首先将无序的数列分成若干小份,分若干份的的规则是不断把每一段数列长度除以2,直到不能再分。然后最小份进行排序,最后再逐步合并为一个有序数列
废话不多说,上代码:
def merge_sort(data):
if len(data) <= 1:
return data
mid = len(data) // 2
left = merge_sort(data[:mid])
right = merge_sort(data[mid:])
result = []
while left and right:
if left[0] < right[0]:
result.append(left.pop(0))
else:
result.append(right.pop(0))
if left:
result += left
if right:
result += right
return result
print(merge_sort([3, 11, 4, 1, 15, 9, 2, 6, 13, 5]))
# 输出: [1, 2, 3, 4, 5, 6, 9, 11, 13, 15]
代码解析:
(1)有这样一组数列,现在我们对其进行递增排序
(2)将原始数列一分为二,得到数列1和数列2
(3)再将数列1和2一分为二,得到数列A,数列B,数列C,数列D
(4)分别对数列A,数列B,数列C,数列D进行排序,然后合并得到数列a,数列b
(5)最后将数列a,数列b合并后排序得到最终结果
总结:
归并排序是一种高效的排序算法,适用于大数据集。它的时间复杂度为O(n log n),其中n是数组的长度。归并排序是稳定的排序算法,即相等的元素在排序后保持它们原来的顺序
注意事项
-
递归深度:虽然归并排序的时间复杂度是O(n log n),但是它的空间复杂度也是O(n),因为它需要额外的空间来存储临时数组。对于非常大的数据集,递归深度可能会成为一个问题,可能会导致栈溢出。
-
原地排序:这段代码不是原地排序算法,因为它需要额外的空间来存储临时数组。如果需要原地排序,可以使用其他算法,如快速排序。
-
稳定性:归并排序是稳定的排序算法,这意味着相等的元素在排序后保持它们原来的顺序。这对于某些应用来说是非常重要的。
平均时间复杂度 | 最坏时间复杂度 | 空间复杂度 | |
合并排序法 | O(n log n) | O(n log n) | O(n) |