In: Computer Science
please write in c++
Algorithm Design problem:
Counting inversions: given an array of n integers, find out the total number of inversions in the given sequence. For example, for the sequence of 2, 4, 1, 3, 5, there are three inversions (2,1), (4,1), and (4,3).
Program: In this program, we write two functions to count the inversions in an array. The first function runs in a time complexity of O(n^2) and the second function runs in O(nlogn) time complexity.
Function 1 algorithm:
Function 2 algorithm:
Code:
#include <iostream>
using namespace std;
// Method 1: Time complexity O(n^2)
int inversionCount1(int arr[], int n){
int invCount = 0;
// Traverse through the array till the end
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
// count the number of elements smaller than current element
// update count
if (arr[i] > arr[j]) {
invCount++;
}
}
}
// Return count
return invCount;
}
// Method 2: Time Complexity O(nlogn)
// Using merge sort
// Function merge
int merge(int arr[], int temp[], int left, int mid, int right){
// Create indices for left and right array i.e i ad j
int i = left, j = mid, k = left;
// Initialize inversion count
int invCount = 0;
// Run a loop while loop until i and j are in range
while ((i <= mid - 1) && (j <= right)) {
// If left array element is small than assign that in the array
if (arr[i] <= arr[j]) {
temp[k++] = arr[i++];
}
else {
temp[k++] = arr[j++];
// Else update inversion count
invCount = invCount + (mid - i);
}
}
// Check if any element is present in left side array
while (i <= mid - 1) {
temp[k++] = arr[i++];
}
// Check if any element is present in right side array
while (j <= right) {
temp[k++] = arr[j++];
}
// Store the values in temp
for (i = left; i <= right; i++) {
arr[i] = temp[i];
}
return invCount;
}
int mergeSort(int arr[], int temp[], int left, int right){
// Initialise inversion count
int mid, invCount = 0;
// Check if left is less than right
if (right > left) {
// Calculate mid
mid = (right + left) / 2;
// Update count
invCount += mergeSort(arr, temp, left, mid);
invCount += mergeSort(arr, temp, mid + 1, right);
invCount += merge(arr, temp, left, mid + 1, right);
}
// Return count
return invCount;
}
// Inversion count2 : using merge Sort
int inversionCount2(int arr[], int array_size){
// Create temporary array
int temp[array_size];
// Call mergesort
return mergeSort(arr, temp, 0, array_size - 1);
}
int main(){
int arr[] = {2, 4, 1, 3, 5};
int n = sizeof(arr) / sizeof(arr[0]);
int ans1 = inversionCount1(arr, n);
int ans2 = inversionCount2(arr, n);
cout << ans1 << endl;
cout << ans2 << endl;
return 0;
}



Output:
