Count Inversions in Array in DSA Javascript - Time & Space Complexity
We want to understand how the time needed to count inversions in an array changes as the array grows.
Specifically, how does the number of steps increase when the array gets bigger?
Analyze the time complexity of the following code snippet.
function countInversions(arr) {
let count = 0;
for (let i = 0; i < arr.length; i++) {
for (let 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 by checking every pair.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Comparing pairs of elements inside two nested loops.
- How many times: The outer loop runs n times, and for each, the inner loop runs up to n times, so roughly n x n = n² times.
As the array size grows, the number of comparisons grows much faster because every new element is compared with many others.
| 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, so doubling the array size makes the work about four times bigger.
Time Complexity: O(n²)
This means the time needed grows quickly as the array gets bigger, because every element is compared with many others.
[X] Wrong: "Since we only have one loop inside another, the time is just twice the input size, so O(2n)."
[OK] Correct: The loops multiply their work, not add. So the inner loop runs many times for each outer loop step, making it grow like n times n, not just 2 times n.
Understanding this helps you explain why simple pair checking is slow for big data and why smarter methods are needed.
"What if we used a divide-and-conquer method like merge sort 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 when a larger number appears before a smaller number in the array.Step 2: Compare options with the definition
A pair of elements where the first is greater than the second and appears before it correctly describes this as a pair where the first element is greater and comes before the second.Final Answer:
A pair of elements where the first is greater than the second and appears before it -> Option BQuick Check:
Inversion = pair (i, j) with i < j and arr[i] > arr[j] [OK]
- Confusing inversion with sorted order
- Thinking inversion counts pairs where first is smaller
- Mixing inversion with total elements count
Solution
Step 1: Identify correct JavaScript syntax for variable initialization
JavaScript usesletorvarwith=for assignment.Step 2: Check each option
let count = 0; useslet count = 0;which is correct. count := 0; uses ':=' which is not JavaScript. int count = 0; uses 'int' which is not JavaScript. var count == 0; uses '==' which is a comparison, not assignment.Final Answer:
let count = 0; -> Option CQuick Check:
Variable assignment in JS uses =, not := or == [OK]
- Using ':=' instead of '='
- Using 'int' keyword from other languages
- Using '==' instead of '=' for assignment
[2, 4, 1, 3, 5]?Solution
Step 1: Identify all inversion pairs in the array
Check pairs where first element is greater and appears before second:
- (2,1), (4,1), (4,3)Step 2: Count the total inversions
There are 3 such pairs.Final Answer:
3 -> Option AQuick Check:
Pairs (2,1), (4,1), (4,3) = 3 inversions [OK]
- Counting pairs where first is smaller
- Missing some inversion pairs
- Counting total pairs instead of inversions
function countInversions(arr) {
let count = 0;
for (let i = 0; i < arr.length; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (arr[i] < arr[j]) {
count++;
}
}
}
return count;
}
What is the error in this code?Solution
Step 1: Understand the inversion condition
An inversion is when arr[i] > arr[j] and i < j, but code checks arr[i] < arr[j].Step 2: Identify the fix
The comparison should be changed to arr[i] > arr[j] to count inversions correctly.Final Answer:
The comparison should be arr[i] > arr[j] to count inversions -> Option DQuick Check:
Inversion means first element bigger, so use > [OK]
- Using < instead of > in condition
- Starting inner loop from 0 instead of i+1
- Resetting count inside loops
[8, 4, 2, 1], which approach will efficiently count the number of inversions?Solution
Step 1: Understand the problem size and efficiency
For larger arrays, nested loops (O(n²)) are slow. Merge sort based counting is efficient (O(n log n)).Step 2: Identify the best approach
Counting inversions during merge sort is a classic efficient method.Final Answer:
Sort the array and count inversions during merge (O(n log n) time) -> Option AQuick Check:
Merge sort inversion count = efficient O(n log n) [OK]
- Using nested loops for large arrays causing slow performance
- Trying to sum elements instead of counting pairs
- Using hash maps which don't help count inversions
Ready to prove it?
Pass the test and this pattern moves unknown
