归并排序
求逆序对我用的是归并排序
直接上我在洛谷里做的那道逆序对的题目的归并排序主要代码吧
void msort(int l, int r) { if (l >= r)return; int mid = (l + r) >> 1; msort(l, mid); msort(mid + 1, r); int i = l, j = mid + 1, k = l; while (i <= mid && j <= r) { if (a[i] > a[j]) { b[k++] = a[j++]; ans += (mid - i + 1); //cout << a[i] << " " << a[j] << endl; } else b[k++] = a[i++]; } while (i <= mid)b[k++] = a[i++]; while (j <= r)b[k++] = a[j++]; for (int i = l; i <= r; i++)a[i] = b[i]; }
最后的数列是按照升序排列的。
ans就是最终逆序对的数量啦!

浙公网安备 33010602011771号