归并排序
1. 主要思想
归并排序算法的主要思想:分治
2. 归并排序的步骤
确定分界点
以数组的中间位置为分界点,分为左右两部分。
mid = (l + r) / 2
递归排序左右两部分
归并——合二为一(重难点)
- 时空复杂度:
- 时间复杂度:\(O(nlog_2n)\)
- 空间复杂度:\(O(n)\)
3. 实现过程(双指针算法)
图片摘自:http://t.csdn.cn/RNb0o
4. 模板
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| 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 (i = l, j = 0; i <= r; i++, j++) q[i] = tmp[j]; }
|