归并排序应用-求逆序对数量
Posted sxq-study
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了归并排序应用-求逆序对数量相关的知识,希望对你有一定的参考价值。
题目:
给定一个长度为n的整数数列,请你计算数列中的逆序对的数量。
逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i < j 且 a[i] > a[j],则其为一个逆序对;否则不是。
输入格式
第一行包含整数n,表示数列的长度。
第二行包含 n 个整数,表示整个数列。
输出格式
输出一个整数,表示逆序对的个数。
数据范围
1≤n≤1000001≤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 }
以上是关于归并排序应用-求逆序对数量的主要内容,如果未能解决你的问题,请参考以下文章