归并排序(Merge Sort)是一种典型的分治思想的应用,它采用递归的方式将一个数组分成两个子数组分别进行排序,并将有序的子数组合并成一个整体有序的数组。
原理:
归并排序的主要步骤是分解、递归解决和合并。
分解:将数组分解成两个较小的子数组,直到子数组的大小为1。
递归解决:递归地对子数组进行排序。
合并:将已排序的子数组合并成一个大的有序数组,直到合并为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
函数则负责合并两个已排序的子数组。
注意:
归并排序的时间复杂度是O(n log n),其中n是待排序元素的数量。这使得它在处理大数据集时非常高效。
归并排序是一种稳定的排序方法,即如果序列中存在两个相等的元素,归并排序不会改变它们的相对位置。
归并排序不是原地排序算法,因为它在合并过程中需要额外的空间来存储临时数组。在最坏的情况下,其空间复杂度是O(n)。