归并排序应用-求逆序对数量

题目:

给定一个长度为n的整数数列,请你计算数列中的逆序对的数量。

逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i < j 且 a[i] > a[j],则其为一个逆序对;否则不是。

输入格式

第一行包含整数n,表示数列的长度。

第二行包含 n 个整数,表示整个数列。

输出格式

输出一个整数,表示逆序对的个数。

数据范围

1n1000001≤n≤100000

输入样例:

6
2 3 4 5 6 1

输出样例:

5

代码:

 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4 
 5 const int N = 1e7;
 6 
 7 long arr[N];
 8 long help[N];
 9 int n;
10 
11 long long ans;
12 
13 void union_sort(int l, int r){
14     if(l >= r)return;
15     int mid = l + r >> 1;
16     union_sort(l, mid);
17     union_sort(mid+1,r);
18     int i = l, j = mid + 1, k = 1;
19     while(i <= mid && j <= r){
20         if(arr[i] <= arr[j])
21             help[k++] = arr[i++];
22         else{
23             help[k++] = arr[j++];
24             ans += mid - i + 1;
25         }
26     }
27     while(i <= mid)help[k++] = arr[i++];
28     while(j <= r)help[k++] = arr[j++];
29     for(int i = l, j = 1;i <= r;++i)
30         arr[i] = help[j++];
31 }
32 
33 int main(){
34     cin >> n;
35     for(int i = 1;i <= n;++i)cin >> arr[i];
36     union_sort(1, n);
37     cout << ans;
38     return 0;
39 }
View Code

猜你喜欢

转载自www.cnblogs.com/sxq-study/p/12378693.html