归并排序

求逆序对我用的是归并排序

直接上我在洛谷里做的那道逆序对的题目的归并排序主要代码吧

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就是最终逆序对的数量啦!

posted @ 2023-07-30 23:08  DLSQS  阅读(28)  评论(0)    收藏  举报