1. 基本思想
"分治-归并排序"是一种经典的排序算法,利用分治法的思想将一个大的问题拆解成多个小问题,再合并求解的过程。具体过程如下:
-
分解:将待排序的数组不断分成两半,递归地对每个子数组进行归并排序,直到每个子数组只包含一个元素(即已经有序)。
-
合并:将两个有序的子数组合并成一个有序的大数组。合并过程是归并排序的核心,它确保在合并时保持数组的有序性。
-
递归:继续递归处理子数组,直到所有子数组都已排序并合并成一个完整的有序数组。
归并排序的时间复杂度为O(n log n),由于需要额外的空间来存储临时数组,因此空间复杂度为O(n)。它是一种稳定的排序算法,适用于大规模数据的排序。
2. 排序数组(中等)
tmp:用于在合并阶段存储排序后的中间结果。
递归基:
- if (l >= r)
:当左边界 l
大于或等于右边界 r
时,说明区间长度为 1 或 0,此时区间本身有序,不需要进一步处理。
划分区间:
- int mid = (l + r) >> 1
:通过计算中间点 mid
,将当前区间 [l, r]
分为两部分:
- 左区间 [l, mid]
- 右区间 [mid + 1, r]
合并两个有序区间:
- int left = l, right = mid + 1, i = 0
:初始化三个指针:
- left
指向左区间的起始位置。
- right
指向右区间的起始位置。
- i
指向临时数组 tmp
的起始位置。
比较左右区间的元素:
- 如果左区间的当前元素小于等于右区间的当前元素,将左区间的元素加入 tmp
,并移动左指针。