您好,欢迎来到纷纭教育。
搜索
您的当前位置:首页求逆序对(C++)

求逆序对(C++)

来源:纷纭教育

分治算法和归并排序。

思路:归并排序是分治的思想,依据归并排序的框架,在出现逆序对时更新总数即可。

代码如下:

#include <iostream>
using namespace std;

long long ans = 0;

void merge(int a[], int left, int right)
{
    if (left == right) return;
    int mid = (left + right) / 2;
    int i = left, j = mid + 1, k = left;
    int *temp = new int[right - left + 1];
    merge(a, left, mid);
    merge(a, mid + 1, right);
    while (i <= mid && j <= right)
    {
        if (a[i] < a[j]) temp[k++] = a[i++];
        else 
        {
            temp[k++] = a[j++];
            ans += mid - i + 1;
        }
    }
    while (i <= mid) temp[k++] = a[i++];
    while (j <= right) temp[k++] = a[j++];
    for (int i = left; i <= right; ++i) a[i] = temp[i];
}

int main()
{
    int n; cin >> n;
    int *a = new int[n + 1];
    for (int i = 1; i <= n; ++i) cin >> a[i];
    merge(a, 1, n);
    cout << ans << endl;
}

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- fenyunshixun.cn 版权所有 湘ICP备2023022495号-9

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务