Inversion Count for an array indicates – how far (or close) the array is from being sorted. If array is already sorted then inversion count is 0. If array is sorted in reverse order that inversion count is the maximum.
Two elements a[i] and a[j] form an inversion if
a[i] > a[j] and i < j. For simplicity, we may
assume that all elements are unique.
Example:
Input: arr[] = {8, 4, 2, 1}
Output: 6
Given array has six inversions (8,4), (4,2),
(8,2), (8,1), (4,1), (2,1).
We have already discussed below approaches.
1) Naive and Merge Sort based approaches.
2) AVL Tree based approach.
In this post an easy implementation of approach 2 using Set in C++ STL is discussed.
1) Create an empty Set in C++ STL (Note that a Set in C++ STL is
implemented using Self-Balancing Binary Search Tree). And insert
first element of array into the set.
2) Initialize inversion count as 0.
3) Iterate from 1 to n-1 and do following for every element in arr[i]
a) Insert arr[i] into the set.
b) Find the first element greater than arr[i] in set
using upper_bound() defined Set STL.
c) Find distance of above found element from last element in set
and add this distance to inversion count.
4) Return inversion count.
#include<bits/stdc++.h>
using namespace std;
int getInvCount( int arr[], int n)
{
multiset< int > set1;
set1.insert(arr[0]);
int invcount = 0;
multiset< int >::iterator itset1;
for ( int i=1; i<n; i++)
{
set1.insert(arr[i]);
itset1 = set1.upper_bound(arr[i]);
invcount += distance(itset1, set1.end());
}
return invcount;
}
int main()
{
int arr[] = {8, 4, 2, 1};
int n = sizeof (arr)/ sizeof ( int );
cout << "Number of inversions count are : "
<< getInvCount(arr,n);
return 0;
}
|
Output:
Number of inversions count are : 6
Note that the worst case time complexity of above implementation is O(n2) as distance function in STL takes O(n) time worst case, but this implementation is much simpler than other implementations and would take much less time than Naive method on average.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above
Whether you're preparing for your first job interview or aiming to upskill in this ever-evolving tech landscape,
GeeksforGeeks Courses are your key to success. We provide top-quality content at affordable prices, all geared towards accelerating your growth in a time-bound manner. Join the millions we've already empowered, and we're here to do the same for you. Don't miss out -
check it out now!
Last Updated :
28 Jun, 2021
Like Article
Save Article