An inversion is a pair of elements where the first element is greater than the second element, but the first element appears before the second in the array.
Click to reveal answer
beginner
Why do we count inversions in an array?
Counting inversions helps measure how far the array is from being sorted. More inversions mean the array is less sorted.
Click to reveal answer
beginner
What is the naive way to count inversions in an array?
Check every pair of elements and count if the first is greater than the second. This takes O(n²) time.
Click to reveal answer
intermediate
How does merge sort help count inversions efficiently?
During merge sort, when merging two sorted halves, we count how many elements from the right half are placed before elements from the left half. This counts inversions in O(n log n) time.
Click to reveal answer
intermediate
What is the time complexity of counting inversions using merge sort?
The time complexity is O(n log n), which is much faster than the naive O(n²) approach.
Click to reveal answer
What does an inversion in an array represent?
AA pair where the first element is smaller and appears before the second
BA pair where the first element is greater and appears before the second
CTwo equal elements next to each other
DAny two elements in the array
✗ Incorrect
An inversion is when a larger element appears before a smaller element.
What is the time complexity of the naive method to count inversions?
AO(n²)
BO(n)
CO(n log n)
DO(log n)
✗ Incorrect
The naive method checks all pairs, leading to O(n²) time.
Which sorting algorithm is commonly used to count inversions efficiently?
ABubble Sort
BInsertion Sort
CMerge Sort
DSelection Sort
✗ Incorrect
Merge Sort can count inversions during the merge step efficiently.
During merge sort, when do we count inversions?
AAfter sorting completes
BWhen splitting the array
CBefore sorting starts
DWhen merging two sorted halves
✗ Incorrect
Inversions are counted while merging two sorted halves.
If an array is already sorted, how many inversions does it have?
AZero
BMaximum possible
CHalf the number of elements
DDepends on the array size
✗ Incorrect
A sorted array has no inversions.
Explain what an inversion in an array is and why counting inversions is useful.
Think about pairs where order is reversed compared to sorted order.
You got /3 concepts.
Describe how merge sort can be modified to count inversions efficiently.
Focus on the merge step where two sorted halves combine.
You got /3 concepts.
Practice
(1/5)
1. What does the term inversion mean in the context of an array?
easy
A. The sum of all elements in the array
B. A pair of elements where the first is smaller than the second and appears before it
C. The total number of elements in the array
D. A pair of elements where the first is greater than the second and appears before it
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. Other options describe unrelated concepts.
Final Answer:
A pair of elements where the first is greater than the second and appears before it -> Option D
Quick Check:
Inversion = pair where earlier element > later element [OK]
Hint: Inversion means earlier bigger than later element [OK]
Common Mistakes:
Confusing inversion with sorted order
Thinking inversion counts total elements
Mixing up greater and smaller element order
2. Which of the following TypeScript function signatures correctly represents a function to count inversions in an array of numbers?
easy
A. function countInversions(arr: string): number[]
B. function countInversions(arr: number): string
C. function countInversions(arr: number[]): number
D. function countInversions(arr: any): void
Solution
Step 1: Analyze the function purpose and parameters
The function should take an array of numbers and return a number representing the count of inversions.
Step 2: Match the correct signature
function countInversions(arr: number[]): number matches this: input is number array, output is number. Others mismatch input/output types.
Final Answer:
function countInversions(arr: number[]): number -> Option C
Quick Check:
Input array, output number count [OK]
Hint: Input array of numbers, output single number [OK]
Common Mistakes:
Using wrong input type like string instead of array
Returning array instead of number
Using void return type when output is needed
3. What is the output of the following TypeScript code?
function countInversions(arr: number[]): number {
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;
}
console.log(countInversions([2, 4, 1, 3, 5]));
medium
A. 3
B. 4
C. 2
D. 5
Solution
Step 1: Identify all inversion pairs in the array
Array: [2, 4, 1, 3, 5]. Inversions are (2,1), (4,1), (4,3). Total 3 inversions.
Step 2: Confirm the count returned by the nested loops
The nested loops count each inversion correctly, so output is 3.
Final Answer:
3 -> Option A
Quick Check:
Inversions = 3 [OK]
Hint: Count pairs where earlier > later element [OK]
Common Mistakes:
Counting pairs incorrectly by missing some
Confusing equal elements as inversions
Off-by-one errors in loops
4. The following code attempts to count inversions but has a bug. What is the bug?
function countInversions(arr: number[]): number {
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;
}
medium
A. The inner loop should start from j = 0 instead of i + 1
B. The outer loop condition should be < instead of <= to avoid out-of-bounds
C. The count variable should be reset inside the outer loop
D. The comparison should be arr[i] < arr[j] instead of >
Solution
Step 1: Analyze the outer loop condition
The outer loop runs from i = 0 to i <= arr.length, which means i can be arr.length, causing arr[i] to be undefined (out-of-bounds).
Step 2: Correct the loop condition
Changing to i < arr.length prevents out-of-bounds access and fixes the bug.
Final Answer:
The outer loop condition should be < instead of <= to avoid out-of-bounds -> Option B
Quick Check:
Loop bounds must prevent out-of-range access [OK]
Hint: Use < length, not <= length in loops [OK]
Common Mistakes:
Using <= causes index out-of-bounds error
Resetting count inside loop loses total count
Changing comparison reverses inversion logic
5. Given the array [8, 4, 2, 1], which approach is the most efficient to count inversions and what is the inversion count?
hard
A. Use a modified merge sort to count inversions; count is 6
B. Use nested loops to count inversions; count is 3
C. Sort the array and count differences; count is 4