Counting inversions in an array

前端 未结 30 2452
死守一世寂寞
死守一世寂寞 2020-11-22 04:14

I\'m designing an algorithm to do the following: Given array A[1... n], for every i < j, find all inversion pairs such that A[i] > A[j]

30条回答
  •  无人共我
    2020-11-22 04:55

    Well I have a different solution but I am afraid that would work only for distinct array elements.

    //Code
    #include 
    using namespace std;
    
    int main()
    {
        int i,n;
        cin >> n;
        int arr[n],inv[n];
        for(i=0;i> arr[i];
        }
        vector v;
        v.push_back(arr[n-1]);
        inv[n-1]=0;
        for(i=n-2;i>=0;i--){
            auto it = lower_bound(v.begin(),v.end(),arr[i]); 
            //calculating least element in vector v which is greater than arr[i]
            inv[i]=it-v.begin();
            //calculating distance from starting of vector
            v.insert(it,arr[i]);
            //inserting that element into vector v
        }
        for(i=0;i

    To explain my code we keep on adding elements from the end of Array.For any incoming array element we find the index of first element in vector v which is greater than our incoming element and assign that value to inversion count of the index of incoming element.After that we insert that element into vector v at it's correct position such that vector v remain in sorted order.

    //INPUT     
    4
    2 1 4 3
    
    //OUTPUT    
    1 0 1 0
    
    //To calculate total inversion count just add up all the elements in output array
    

提交回复
热议问题