Question

In: Computer Science

The sequence 2, 4, 1, 3, 5 has three inversions (2,1), (4,1), (4,3). Using C++ Code...

The sequence 2, 4, 1, 3, 5 has three inversions (2,1), (4,1), (4,3). Using C++ Code an O(nlog(n)) algorithm to count the number of inversions. Use the Merge sort Algorithm, and use the template below: (Use the file below that to test)

countInv.cpp -------------------------------------------------------------------------------------------------------------------------------

#include <vector>
#include <algorithm>

using namespace std;


int mergeInv(vector<int>& nums, vector<int>& left, vector<int>& right) {

// Your code here


}

int countInv(vector<int>&nums) {
// Your code here


}

CountInv_test.cpp -------------------------------------------------------------------------------------------------------------------------

#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
}


Solutions

Expert Solution


#include <bits/stdc++.h>
using namespace std;

int _mergeSort(int arr[], int temp[], int left, int right);


int merge(int arr[], int temp[], int left, int mid, int right);

/* This function sorts the input array and returns the number of inversions in the array */

int mergeSort(vector<int>&arr)
{   int array_size=arr.size();
   int temp[array_size];
   return _mergeSort(arr, temp, 0, array_size - 1);
}

/* An auxiliary recursive function that sorts the input array and
returns the number of inversions in the array. */
int _mergeSort(vector<int>&arr, vector<int>&temp, int left, int right)
{
   int mid, inv_count = 0;
   if (right > left) {
       /* Divide the array into two parts and call _mergeSortAndCountInv() for each of the parts */
       mid = (right + left) / 2;

       /* Inversion count will be sum of inversions in left-part, right-part and number of inversions in merging */
       inv_count += _mergeSort(arr, temp, left, mid);
       inv_count += _mergeSort(arr, temp, mid + 1, right);

       /*Merge the two parts*/
       inv_count += merge(arr, temp, left, mid + 1, right);
   }
   return inv_count;
}

/* This funt merges two sorted arrays and returns inversion count in the arrays.*/
int merge(int arr[], int temp[], int left,
       int mid, int right)
{
   int i, j, k;
   int inv_count = 0;

   i = left; /* i is index for left subarray*/
   j = mid; /* j is index for right subarray*/
   k = left; /* k is index for resultant merged subarray*/
   while ((i <= mid - 1) && (j <= right)) {
       if (arr[i] <= arr[j]) {
           temp[k++] = arr[i++];
       }
       else {
           temp[k++] = arr[j++];

           /* this is tricky -- see above
           explanation/diagram for merge()*/
           inv_count = inv_count + (mid - i);
       }
   }

   /* Copy the remaining elements of left subarray
(if there are any) to temp*/
   while (i <= mid - 1)
       temp[k++] = arr[i++];

   /* Copy the remaining elements of right subarray
(if there are any) to temp*/
   while (j <= right)
       temp[k++] = arr[j++];

   /*Copy back the merged elements to original array*/
   for (i = left; i <= right; i++)
       arr[i] = temp[i];

   return inv_count;
}


int main()
{
   int arr[] = { 1, 20, 6, 4, 5 };
   int n = sizeof(arr) / sizeof(arr[0]);
   int ans = CountInv(arr);
   cout << " Number of inversions are " << ans;
   return 0;
}



Related Solutions

The sequence 2, 4, 1, 3, 5 has three inversions (2,1), (4,1), (4,3). Using C++ Code...
The sequence 2, 4, 1, 3, 5 has three inversions (2,1), (4,1), (4,3). Using C++ Code an O(nlog(n)) algorithm to count the number of inversions. Use the Merge sort Algorithm, and use the template below: (Use the file below that to test) countInv.cpp ------------------------------------------------------------------------------------------------------------------------------- #include <vector> #include <algorithm> using namespace std; int mergeInv(vector<int>& nums, vector<int>& left, vector<int>& right) { // Your code here } int countInv(vector<int>&nums) { // Your code here } CountInv_test.cpp ------------------------------------------------------------------------------------------------------------------------- #include <iostream> #include <vector> using namespace...
Fix the C++ code to count the number of inversions using the given array. The answer...
Fix the C++ code to count the number of inversions using the given array. The answer is 8 inversions, but I am only getting 6 inversions. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #include <iostream> using namespace std; int mergeInversion(int arr[], int l, int m, int r) {     // size of the two arrays     int n1 = m - l + 1;     int n2 = r - m;     // create temporary arrays     int L[n1];     int R[n2];     // Copy the...
Assume that there are a sequence of consecutive integers 1, 2, 3, 4, 5, ... 15....
Assume that there are a sequence of consecutive integers 1, 2, 3, 4, 5, ... 15. Tom and Jim respectively select a number from the sequence randomly (no repetition). Given that Tom’s number is divisible by 5, what’s the probability that Tom’s number is greater than Jim’s number ?
Direction ratio of line joining (2, 3, 4) and (−1, −2, 1), are: A. (−3, −5, −3) B. (−3, 1, −3) C. (−1, −5, −3) D. (−3, −5, 5)
Direction ratio of line joining (2, 3, 4) and (−1, −2, 1), are:A. (−3, −5, −3)B. (−3, 1, −3)C. (−1, −5, −3)D. (−3, −5, 5)
Consider the following virtual page reference sequence: page 1, 2, 3, 4, 2, 1, 5, 6,...
Consider the following virtual page reference sequence: page 1, 2, 3, 4, 2, 1, 5, 6, 2, 1, 2, 3. This indicates that these particular pages need to be accessed by the computer in the order shown. Consider each of the following 4 algorithm-frame combinations: LRU with 3 frames FIFO with 3 frames LRU with 4 frames FIFO with 4 frames Print a copy of this page. For each of the 4 combinations, below, move from left to right as...
write a java code to calculate 1+2-3+4-5 …-99+100
write a java code to calculate 1+2-3+4-5 …-99+100
4. (a) Suppose that τσ=(1 5 2 3)(4) and στ=(1 2 4 5)(3) in S5. If...
4. (a) Suppose that τσ=(1 5 2 3)(4) and στ=(1 2 4 5)(3) in S5. If σ1 = 2, find σ and τ. (b) In Sn, show that σ = τ if and only if σ(τ)^(−1) = ε. ε is the identity permutation. Must be written as a proof. (c) Let σ=(1 2 3) and τ=(1 2) in S3. Show that S3={ε,σ,σ^2,τ,τσ,τ(σ)^2} and that σ^3=ε=τ^2 and στ=τ(σ)^2, then fill out the multiplication table for S3.
coffee tea juice 3 4 5 5 4 3 4 4 4 5 1 2 4...
coffee tea juice 3 4 5 5 4 3 4 4 4 5 1 2 4 2 2 Do a One-way ANOVA by hand (at least once in your life!) …Is there a difference in attention for those who drink coffee, tea, or juice during an 8 a.m. class? Utilize the five steps of hypothesis testing to analyze the following data (p<.01). Attention Ratings (1=no attention- 5=full attention)
trace by using quicksort on the array : 4 6 5 3 2 7 1 using...
trace by using quicksort on the array : 4 6 5 3 2 7 1 using 7 as the pivot
Find the distances: A) Between ?1=〈2+2?,−1+?,−3?〉and ?2=〈4,−5−3?,1+4?〉 . B) Between the planes 2?−?+5?=0 and 2?−?+5?=5 ....
Find the distances: A) Between ?1=〈2+2?,−1+?,−3?〉and ?2=〈4,−5−3?,1+4?〉 . B) Between the planes 2?−?+5?=0 and 2?−?+5?=5 . C) From the point (1,2,3) to the line ?=〈−?,4−?,1+4?〉 .
ADVERTISEMENT
ADVERTISEMENT
ADVERTISEMENT