题解 | 逆序对的数量

逆序对的数量

https://www.nowcoder.com/practice/00deaff087cf42b69ac73903cba4b26c

#include<iostream>

using namespace std;
long long ans = 0;

void merge(int nums[], int left, int mid, int right) {
    int i = left, j = mid + 1, k = 0;
    int temp[right - left + 1];
    while (i <= mid && j <= right) {
        if (nums[i] <= nums[j]) temp[k++] = nums[i++];
        else {
            ans += mid - i + 1;
            temp[k++] = nums[j++];
        }
    }
    while (i <= mid) temp[k++] = nums[i++];
    while (j <= right) temp[k++] = nums[j++];
    for (int i = left; i <= right; i++) nums[i] = temp[i - left];
}

void mergeSort(int nums[], int left, int right) {
    if (left >= right) return;
    int mid = (left + right) / 2;
    mergeSort(nums, left, mid);
    mergeSort(nums, mid + 1, right);
    merge(nums, left, mid, right);
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n;
    cin >> n;
    int nums[n];
    for (int i = 0; i < n; i++) cin >> nums[i];
    mergeSort(nums, 0, n - 1);
    cout << ans << endl;
    return 0;
}

全部评论

相关推荐

狸猫换offer:埋点都出来了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务