归并排序:算法原理与实现
归并排序(Merge Sort)是一种经典的排序算法,它采用分治策略(Divide and Conquer)来对数组进行排序。该算法的基本思想是将数组分成若干个较小的部分,分别对它们进行排序,然后合并成较大的部分,直到整个数组排序完成。归并排序因其高效和稳定性在计算机科学中有着广泛的应用。
算法原理
- 分解(Divide):将待排序的数组从中间分成两个子数组。
- 解决(Conquer):递归地对两个子数组进行归并排序。
- 合并(Merge):将两个已排序的子数组合并成一个有序的数组。
算法实现
Python 示例
def merge_sort(arr):
if len(arr) <= 1:
return arr
mid = len(arr) // 2
left_half = arr[:mid]
right_half = arr[mid:]
merge_sort(left_half)
merge_sort(right_half)
i, j, k = 0, 0, 0
while i < len(left_half) and j < len(right_half):
if left_half[i] < right_half[j]:
arr[k] = left_half[i]
i += 1
else:
arr[k] = right_half[j]
j += 1
k += 1
while i < len(left_half):
arr[k] = left_half[i]
i += 1
k += 1
while j < len(right_half):
arr[k] = right_half[j]
j += 1
k += 1
# 示例
arr = [12, 11, 13, 5, 6, 7]
merge_sort(arr)
print("Sorted array is:", arr)
复杂度分析
- 时间复杂度:归并排序的时间复杂度为 $O(n \log n)$,其中 $n$ 是数组的长度。这是因为算法将数组分成两半,并递归地对这两半进行排序,每次递归的时间复杂度是 $O(n)$,而递归的深度是 $\log n$。
- 空间复杂度:归并排序的空间复杂度为 $O(n)$,因为它需要一个额外的数组来存储排序过程中的中间结果。
应用场景
归并排序因其稳定性(相等的元素在排序后保持原来的顺序)和高效性,在处理大规模数据集时非常有效。它特别适用于链表排序、外部排序(数据量太大,无法全部加载到内存中)以及需要稳定排序算法的场景。
总结
归并排序是一种高效且稳定的排序算法,通过分治策略将问题分解成更小的部分,然后逐步合并,最终得到有序数组。尽管它在空间复杂度上不如其他排序算法高效,但其在时间复杂度上的优势使其在许多应用场景中非常有用。