逆序对 - 归并排序求逆序对

 
#include <bits/stdc++.h>
using namespace std;

class Solution
{
public:
   int InversePairs(vector<int> data)
   {
       ans = 0;
       merge_sort(data, 0, data.size() - 1);
       return ans;
   }

   vector<int> merge(vector<int> &vl, vector<int> &vr)
   {
       int n1 = vl.size(), n2 = vr.size();
       vector<int> res(n1 + n2);
       int i = 0, j = 0, cnt = 0;
       while (i < n1 && j < n2)
       {
           if (vl[i]  <= vr[j])
               res[cnt++] = vl[i++];
           else
           {
               ans += n1 - i;/* 统计答案 */
               res[cnt++] = vr[j++];
           }
       }
       while (i < n1)
           res[cnt++] = vl[i++];
       while (j < n2)
           res[cnt++] = vr[j++];
       return res;
   }

   vector<int> merge_sort(vector<int> &nums, int l, int r)
   {
       vector<int> vl, vr;
       if (l < r)
       {
           int mid = (l + r) >> 1;
           vl = merge_sort(nums, l, mid);
           vr = merge_sort(nums, mid + 1, r);
           return merge(vl, vr);
       }
       else
       {
           vector<int> ve(r - l + 1);
           int cnt = 0;
           for (int i = l; i <= r; ++i)
               ve[cnt++] = nums[i];
           return ve;
       }
   }
private:
   int ans;
};

int main(int argc, char const *argv[])
{
   int n;
   while (cin >> n)
   {
       vector<int> nums(n);
       for (int i = 0; i < n; ++i)
           cin >> nums[i];
       Solution solution;
       int ans = solution.inversePairs(nums);
       cout << ans << endl;
   }
   return 0;
}

 

posted @   北岛知寒  阅读(150)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示
主题色彩