分治这一块确实是一个难点
因为涉及到递归,实际用起来比较难
而且能想到分治做法就不容易了
归并排序就是分治的典型应用
通过对数组不断拆分,然后再把小区间合并成有序的区间
思想就是如此,具体流程可以看这篇博客 归并排序叫排序,确实可以是一个的稳定排序
但用处最多的还是用来求逆序对
就是在合并区间的时候利用单调性统计逆序对个数
我觉得这篇博客写的比较详细
放别人的就是方便
void merge(int a[], int l, int r) { //a就是需要排序/求逆序对的数组
if (l == r) return;
int m = (l + r) >> 1, i = l, j = m + 1, o = l;
merge(a, l, m); //先处理子问题
merge(a, m + 1, r);
while (i <= m && j <= r) //将小区间有序合并
if (a[i] > a[j]) tmp[o++] = a[j++], ans += m - i + 1; //ans统计逆序对,好好理解
//i后面到m的元素一定比a[j]大
else tmp[o++] = a[i++];
while (i <= m) tmp[o++] = a[i++];
while (j <= r) tmp[o++] = a[j++];
for (int i = l; i <= r; ++i) a[i] = tmp[i];
}