In: Computer Science
sorting- Inversion Count for an array indicates
Language: c++
Your solution has to be O(n log n).
please write comments
*countinv.cpp*
// Count inversions - homework
// Based off of mergesort
#include <vector>
#include <algorithm> // For copy
using namespace std;
int mergeInv(vector<int>& nums, vector<int>& left, vector<int>& right) {
// You will need this helper function that calculates the inversion while merging
// Your code here
}
int countInv(vector<int>&nums) {
// Your code here
}
//test code
/* Count the number of inversions in O(n log n) time */
#include <iostream>
#include <vector>
using namespace std;
int countInv(vector<int>& numvec);
int main()
{
int n;
vector<int> numvec{4, 5, 6, 1, 2, 3};
n = countInv(numvec);
cout << "Number of inversions " << n << endl; // Should be 9
numvec = {1, 2, 3, 4, 5, 6};
n = countInv(numvec);
cout << "Number of inversions " << n << endl; // Should be 0
numvec = {6, 5, 4, 3, 2, 1};
n = countInv(numvec);
cout << "Number of inversions " << n << endl; // Should be 15
numvec = {0, 0, 0, 0, 0, 0};
n = countInv(numvec);
cout << "Number of inversions " << n << endl;; // Should be 0
}
*countinv_test.cpp*
/* Count the number of inversions in O(n log n) time */
#include <iostream>
#include <vector>
using namespace std;
int countInv(vector<int>& numvec);
int main()
{
int n;
vector<int> numvec{4, 5, 6, 1, 2, 3};
n = countInv(numvec);
cout << "Number of inversions " << n << endl; // Should be 9
numvec = {1, 2, 3, 4, 5, 6};
n = countInv(numvec);
cout << "Number of inversions " << n << endl; // Should be 0
numvec = {6, 5, 4, 3, 2, 1};
n = countInv(numvec);
cout << "Number of inversions " << n << endl; // Should be 15
numvec = {0, 0, 0, 0, 0, 0};
n = countInv(numvec);
cout << "Number of inversions " << n << endl;; // Should be 0
}
#include<bits/stdc++.h>
using namespace std;
int x;
int temp[1000];
void merge(vector <int> a, int l, int m,int r){ //Merge Algorithm
int k=0;
int i=l;
int j=m+1;
while(i<=m && j<=r){
if (a[i]>a[j]){ //inversion
temp[k]=a[j];
j+=1;
x+=m-i+1;
}
else{
temp[k]=a[i];
i+=1;
}
k+=1;
}
if(i>m){ //Copying remaining right half of array
while(j<=r){
temp[k]=a[j];
k+=1;
j+=1;
}
}
else{ //Copying remaining left half of array
while(i<=m){
temp[k]=a[i];
k+=1;
i+=1;
}
}
k=0;
for(i=l;i<=r;i++){
a[i]=temp[k];
k+=1;
}
}
void mergeSort(vector <int> a,int l,int r){ //Merge Sort Algorithm
if (l<r){
int m=(l+r)/2;
mergeSort(a,l,m);
mergeSort(a,m+1,r);
merge(a,l,m,r);
}
}
int countInv(vector<int> numvec){
x=0; //keeps track of no.of inversions
mergeSort(numvec,0,numvec.size()-1);
return x;
}
int main()
{
int n;
vector<int> numvec{4, 5, 6, 1, 2, 3};
n = countInv(numvec);
cout << "Number of inversions " << n << endl; // Should be 9
numvec = {1, 2, 3, 4, 5, 6};
n = countInv(numvec);
cout << "Number of inversions " << n << endl; // Should be 0
numvec = {6, 5, 4, 3, 2, 1};
n = countInv(numvec);
cout << "Number of inversions " << n << endl; // Should be 15
numvec = {0, 0, 0, 0, 0, 0};
n = countInv(numvec);
cout << "Number of inversions " << n << endl;; // Should be 0
}