Count Inversions in Array in DSA C# - Time & Space Complexity
We want to understand how long it takes to count inversions in an array as the array grows.
Specifically, how does the work increase when the array size gets bigger?
Analyze the time complexity of the following code snippet.
public int CountInversions(int[] arr) {
int count = 0;
for (int i = 0; i < arr.Length - 1; i++) {
for (int j = i + 1; j < arr.Length; j++) {
if (arr[i] > arr[j]) {
count++;
}
}
}
return count;
}
This code counts how many pairs of elements are out of order in the array.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Comparing pairs of elements inside nested loops.
- How many times: The outer loop runs n-1 times, and for each, the inner loop runs fewer times, roughly n times.
As the array size grows, the number of comparisons grows much faster.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 45 comparisons |
| 100 | About 4,950 comparisons |
| 1000 | About 499,500 comparisons |
Pattern observation: The operations grow roughly by the square of the input size.
Time Complexity: O(n²)
This means if the array size doubles, the work to count inversions roughly quadruples.
[X] Wrong: "Counting inversions can be done in linear time by just scanning once."
[OK] Correct: Because each element must be compared with many others to find all out-of-order pairs, a single scan is not enough.
Understanding this helps you see why some problems need more work as input grows and prepares you to discuss better methods like merge sort based counting.
"What if we used a merge sort based method to count inversions? How would the time complexity change?"
Practice
inversion mean in the context of an array?Solution
Step 1: Understand the definition of inversion
An inversion is a pair of elements (i, j) such that i < j but array[i] > array[j].Step 2: Compare options with definition
A pair of elements where the first is greater than the second and appears before it correctly describes this condition, while others describe unrelated concepts.Final Answer:
A pair of elements where the first is greater than the second and appears before it -> Option AQuick Check:
Inversion = pair (i, j) with i < j and array[i] > array[j] [OK]
- Confusing inversion with sorted order
- Thinking inversion counts pairs where first is smaller
- Counting total elements instead of pairs
arr with values 3, 1, 2?Solution
Step 1: Review C# array initialization syntax
In C#, arrays must be declared asint[] arrand can be initialized explicitly withnew int[] {values};Step 2: Check each option
int arr[] = new int[3] {3, 1, 2}; uses invalid declaration syntax (arr[]). int arr = {3, 1, 2}; tries to assign an array to an int. int arr[] = {3, 1, 2}; uses invalid declaration syntax (arr[]). int[] arr = new int[] {3, 1, 2}; uses the correct explicit syntax.Final Answer:
int[] arr = new int[] {3, 1, 2}; -> Option CQuick Check:
Correct array init uses new int[] {values} [OK]
- Omitting new int[] in initialization
- Using C/C++ style array declaration
- Incorrect array size syntax
arr = {2, 4, 1, 3, 5}?
int CountInversions(int[] arr) {
int count = 0;
for (int i = 0; i < arr.Length - 1; i++) {
for (int j = i + 1; j < arr.Length; j++) {
if (arr[i] > arr[j]) count++;
}
}
return count;
}
int[] arr = {2, 4, 1, 3, 5};
Console.WriteLine(CountInversions(arr));Solution
Step 1: Identify all inversion pairs in the array
Pairs where first > second and first index < second index: (2,1), (4,1), (4,3) -> total 3 inversions.Step 2: Confirm code counts these pairs
Nested loops check all pairs; count increments for each inversion found, matching the 3 pairs.Final Answer:
3 -> Option AQuick Check:
Count inversions in {2,4,1,3,5} = 3 [OK]
- Counting pairs where first is smaller
- Missing some inversion pairs
- Off-by-one errors in loops
int CountInversions(int[] arr) {
int count = 0;
for (int i = 0; i < arr.Length; i++) {
for (int j = 0; j < arr.Length; j++) {
if (arr[i] > arr[j]) count++;
}
}
return count;
}Solution
Step 1: Analyze loop ranges for counting inversions
Inversion pairs require i < j, but inner loop starts at 0, counting pairs twice and including invalid pairs.Step 2: Fix inner loop start index
Changing inner loop to start at i+1 ensures only pairs with i < j are counted once.Final Answer:
Inner loop should start from i+1, not 0 -> Option DQuick Check:
Count inversions need j > i, so inner loop from i+1 [OK]
- Starting inner loop at 0 causing double counting
- Reversing comparison operator
- Misplacing count initialization
arr = {8, 4, 2, 1}, what is the total number of inversions? Use the efficient merge sort based method to count inversions.Solution
Step 1: Understand inversions in the array
Pairs: (8,4), (8,2), (8,1), (4,2), (4,1), (2,1) -> 6 inversions.Step 2: Count inversions using merge sort method
Subarrays [8,4] and [2,1] each add 1 inversion (total 2). Final merge of [4,8] and [1,2]: +2 when taking 1, +2 when taking 2 (total 4). Grand total: 6.Final Answer:
6 -> Option BQuick Check:
Merge sort inversion count for {8,4,2,1} = 6 [OK]
- Counting only direct pairs, missing cross merges
- Using brute force count only
- Misunderstanding merge step inversion counting
Ready to prove it?
Pass the test and this pattern moves unknown
