Quick Sort Algorithm in DSA Java - Time & Space Complexity
We want to understand how the time taken by Quick Sort changes as the list size grows.
How does the number of steps grow when sorting bigger lists?
Analyze the time complexity of the following Quick Sort code snippet.
public void quickSort(int[] arr, int low, int high) {
if (low < high) {
int pi = partition(arr, low, high);
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
private int partition(int[] arr, int low, int high) {
int pivot = arr[high];
int i = low - 1;
for (int j = low; j <= high - 1; j++) {
if (arr[j] <= pivot) {
i++;
int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp;
}
}
int temp = arr[i + 1]; arr[i + 1] = arr[high]; arr[high] = temp;
return i + 1;
}
This code sorts an array by picking a pivot, dividing the array around it, and sorting the parts recursively.
Look at what repeats as the input grows.
- Primary operation: The partition loop that compares and swaps elements.
- How many times: This loop runs once per recursive call, covering parts of the array each time.
- Recursion: The function calls itself twice on smaller parts after partitioning.
As the list size grows, the number of comparisons depends on how well the pivot splits the list.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 30 to 50 comparisons |
| 100 | About 700 to 1,000 comparisons |
| 1000 | About 10,000 to 15,000 comparisons |
Pattern observation: If the pivot splits evenly, operations grow a bit more than n times log n; if splits are uneven, it can grow closer to n squared.
Time Complexity: O(n log n)
This means sorting takes a bit more than n times the steps needed to split the list repeatedly in half.
[X] Wrong: "Quick Sort always takes the same time regardless of input order."
[OK] Correct: If the pivot is always the smallest or largest element, Quick Sort does more work and slows down to n squared time.
Understanding Quick Sort's time complexity helps you explain why it is fast on average and what cases slow it down, showing your grasp of sorting efficiency.
"What if we always picked the middle element as pivot instead of the last? How would the time complexity change?"
Practice
Quick Sort algorithm?Solution
Step 1: Understand Quick Sort's approach
Quick Sort picks a pivot element and divides the array into parts smaller and larger than the pivot.Step 2: Recursive sorting of parts
It then sorts these parts recursively, combining them to get the sorted array.Final Answer:
Divide the array into smaller parts using a pivot and sort them recursively -> Option DQuick Check:
Quick Sort = Divide and conquer [OK]
- Confusing Quick Sort with Bubble Sort
- Thinking Quick Sort merges arrays like Merge Sort
- Assuming Quick Sort inserts elements one by one
Solution
Step 1: Check Java method declaration syntax
Java methods must specify access modifier, return type, method name, and parameter types with names.Step 2: Validate each option
public int partition(int[] arr, int low, int high) correctly declares a public method returning int with parameters typed and named properly.Final Answer:
public int partition(int[] arr, int low, int high) -> Option BQuick Check:
Java method syntax = public int partition(int[] arr, int low, int high) [OK]
- Omitting return type
- Missing parameter types
- Incorrect order of parameters
arr = [8, 3, 7, 6, 2] with pivot as last element?Solution
Step 1: Choose pivot and partition
Pivot is last element 2. Move elements smaller than 2 to left.Step 2: Rearrange array
No elements smaller than 2, so swap 2 with first element 8. Result: [2, 3, 6, 7, 8]Step 3: Check order after partition
Elements less than pivot (none) are left, others right. No further swaps in first partition.Final Answer:
[2, 3, 6, 7, 8] -> Option AQuick Check:
Pivot 2 placed correctly, smaller left, larger right [OK]
- Not swapping pivot correctly
- Assuming all smaller elements are sorted immediately
- Confusing pivot position after partition
int partition(int[] arr, int low, int high) {
int pivot = arr[high];
int i = low;
for (int j = low; j < high; j++) {
if (arr[j] < pivot) {
swap(arr, i, j);
i++;
}
}
swap(arr, i, high);
return i;
}Solution
Step 1: Analyze initialization of i
In Lomuto partition, i starts at low - 1 to track smaller elements index before loop.Step 2: Check loop and swaps
Starting i at low causes incorrect swaps and pivot placement.Final Answer:
Variable i should start at low - 1 -> Option CQuick Check:
i = low - 1 for correct partition [OK]
- Starting i at low causes wrong partition
- Changing pivot position incorrectly
- Using wrong loop bounds
Solution
Step 1: Understand problem with duplicates
Standard Quick Sort performs poorly with many duplicates due to repeated swaps.Step 2: Apply three-way partitioning
Three-way partitioning divides array into less than, equal to, and greater than pivot, reducing unnecessary work.Step 3: Evaluate other options
Picking first element or skipping sorting duplicates doesn't improve performance reliably; Bubble Sort is inefficient.Final Answer:
Use a three-way partitioning to separate less, equal, and greater elements -> Option AQuick Check:
Three-way partitioning = better with duplicates [OK]
- Picking fixed pivot without randomization
- Ignoring duplicates in partitioning
- Switching to inefficient sorts unnecessarily
Ready to prove it?
Pass the test and this pattern moves unknown
