题目链接
1. 快速排序
2. 归并排序
思路
算法的思想是分治
一句话总结:将排序的任务先递归分解成一个一个小的任务,将小的任务完成,再用小任务完成大任务,逐步完成最终得到整个排序的任务。
一张图片直观表示分治的思路:

题解思路
-
上图中的每一层如何实现?
通过递归的方式。将数组递归处理,处理
q[l, mid]和q[mid+1, r]来实现 -
“治”中,如何实现两个子数组的有序合并?
【两个有序数组的合并】问题可以通过双指针算法求解

题解模板
- 通过函数调用递归来实现,因此参数传入为 int q[], int l, int r
- 【递归结束条件】当小任务中有 0 个或者 1 个数时,返回
- 【分】递归左边和右边
- 【治】两个有序数组的合并
- 设置辅助数组 tmp
- 界定退出循环为:两个子数组有一个遍历完成
- 将未遍历完的数据追加到尾部
- 将 tmp 数组内容放回 q 中
题解代码
void merge_sort(int q[], int l, int r) {
if (l >= r) return;
int mid = l + r >> 1;
merge_sort(q, l, mid), merge_sort(q, mid + 1, r);
int k = 0, i = l, j = mid + 1;
while(i <= mid && j <= r) {
if (q[i] <= q[j]) tmp[k++] = q[i++];
else tmp[k++] = q[j++];
}
while (i <= mid) tmp[k++] = q[i++];
while (j <= r) tmp[k++] = q[j++];
for (int i = l, j = 0; i <= r; i++, j++) q[i] = tmp[j];
}