标签:sort int 1000005 mid ++ 解法 逆序
例题
原题链接:https://www.acwing.com/problem/content/790/
给定一个长度为 n 的整数数列,请你计算数列中的逆序对的数量。
逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i<j 且 a[i]>a[j],则其为一个逆序对;否则不是。
暴力解法
不推荐,两重循环遍历,O(n^2)的复杂度,容易TLE;
#include<bits/stdc++.h>
using namespace std;
int a[1000005];
int n;
int cnt;
int main()
{
cin >> n;
for(int i = 0 ; i < n ; i++)
{
cin >> a[i];
}
for(int i = 0 ; i < n ; i++)
{
for(int j = i ; j < n ; j ++)
{
if(a[i] > a[j])
{
cnt++;
}
}
}
cout << cnt;
return 0;
}
归并
#include<bits/stdc++.h>
using namespace std;
long long n , res;
int a[1000005] , tmp[1000005];
void m_sort(int a[] , int l , int r)
{
if(l >= r)
{
return;
}
int mid = (l + r) >> 1;
m_sort(a , l , mid);
m_sort(a , mid+1 , r);
int k = 0;
int i = l,j = mid + 1;
while(i <= mid && j <= r)
{
if(a[i] <= a[j])
{
tmp[k++] = a[i++];
}
else
{
tmp[k++] = a[j++];
res += (mid - i + 1);
}
}
while(i <= mid)
{
tmp[k++] = a[i++];
}
while(j <= r)
{
tmp[k++] = a[j++];
}
for(int i = l , j = 0;i <= r ; i++ ,j++)
{
a[i] = tmp[j];
}
}
int main()
{
cin >> n;
for(int i = 0 ; i < n ; i++)
{
cin >> a[i];
}
m_sort(a , 0 , n - 1);
cout << res;
return 0;
}
标签:sort,int,1000005,mid,++,解法,逆序 来源: https://www.cnblogs.com/RimekeyBergling/p/16504513.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。