归并排序(Merge Sort)是一种典型的分治思想的应用,它采用递归的方式将一个数组分成两个子数组分别进行排序,并将有序的子数组合并成一个整体有序的数组。

原理

归并排序的主要步骤是分解、递归解决和合并。

  1. 分解:将数组分解成两个较小的子数组,直到子数组的大小为1。

  2. 递归解决:递归地对子数组进行排序。

  3. 合并:将已排序的子数组合并成一个大的有序数组,直到合并为1个完整的数组。

合并是归并排序的核心步骤。在合并时,我们会比较两个子数组的首个元素,选择较小的元素放入结果数组,然后移动指针到下一个元素,重复这个过程直到一个子数组为空。最后,将非空子数组的剩余元素(如果有的话)复制到结果数组的末尾。

实现

以下是归并排序的Python实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
def merge_sort(arr):
if len(arr) <= 1:
return arr

# 分解:找到中点,将数组分成两半
mid = len(arr) // 2
left_half = arr[:mid]
right_half = arr[mid:]

# 递归解决:对左右两半分别进行归并排序
left_half = merge_sort(left_half)
right_half = merge_sort(right_half)

# 合并:将两个已排序的半部分合并成一个有序数组
return merge(left_half, right_half)

def merge(left, right):
merged = []
left_index = 0
right_index = 0

# 合并两个数组,直到其中一个为空
while left_index < len(left) and right_index < len(right):
if left[left_index] < right[right_index]:
merged.append(left[left_index])
left_index += 1
else:
merged.append(right[right_index])
right_index += 1

# 将剩余的元素(如果有的话)添加到结果数组中
merged.extend(left[left_index:])
merged.extend(right[right_index:])

return merged

# 测试代码
arr = [38, 27, 43, 3, 9, 82, 10]
sorted_arr = merge_sort(arr)
print("排序后的数组:", sorted_arr)

在这个实现中,merge_sort函数是主要的递归函数,负责分解数组并递归地调用自身来排序子数组。merge函数则负责合并两个已排序的子数组。

注意

  1. 归并排序的时间复杂度是O(n log n),其中n是待排序元素的数量。这使得它在处理大数据集时非常高效。

  2. 归并排序是一种稳定的排序方法,即如果序列中存在两个相等的元素,归并排序不会改变它们的相对位置。

  3. 归并排序不是原地排序算法,因为它在合并过程中需要额外的空间来存储临时数组。在最坏的情况下,其空间复杂度是O(n)。