Sorting Stability and When to Use Which Sort in DSA Javascript - Time & Space Complexity
Sorting is a common task where we arrange items in order. Knowing how long different sorting methods take helps us pick the best one.
We want to understand how the time to sort grows as the list gets bigger and when to choose each sort.
Analyze the time complexity of these sorting methods.
// Example: Bubble Sort (stable)
function bubbleSort(arr) {
for (let i = 0; i < arr.length - 1; i++) {
for (let j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
}
}
}
return arr;
}
// Example: Quick Sort (unstable)
function quickSort(arr) {
if (arr.length <= 1) return arr;
const pivot = arr[arr.length - 1];
const left = arr.filter(x => x < pivot);
const right = arr.filter(x => x > pivot);
const equal = arr.filter(x => x === pivot);
return [...quickSort(left), ...equal, ...quickSort(right)];
}
Bubble Sort is stable and simple but slower; Quick Sort is faster on average but unstable.
Look at the loops and recursive calls that repeat work.
- Bubble Sort: Nested loops comparing and swapping elements repeatedly.
- Quick Sort: Recursive calls splitting the array and filtering elements.
- Dominant operation: Comparisons and swaps in Bubble Sort; recursive splits and filtering in Quick Sort.
As the list grows, Bubble Sort does many more comparisons, while Quick Sort splits the list efficiently.
| Input Size (n) | Approx. Operations Bubble Sort | Approx. Operations Quick Sort |
|---|---|---|
| 10 | ~100 (10*10) | ~30 (10 log 10) |
| 100 | ~10,000 (100*100) | ~700 (100 log 100) |
| 1000 | ~1,000,000 (1000*1000) | ~10,000 (1000 log 1000) |
Bubble Sort grows much faster, roughly by the square of input size; Quick Sort grows slower, roughly input size times log of input size.
Time Complexity: O(n²) for Bubble Sort, O(n log n) average for Quick Sort
Bubble Sort takes much longer as the list grows, while Quick Sort is faster but can be slower in the worst case.
[X] Wrong: "Faster sorting always means stable sorting."
[OK] Correct: Some fast sorts like Quick Sort are unstable, meaning equal items can change order, which matters in some cases.
Understanding when to use stable or unstable sorts and their time costs shows you know how to pick the right tool for the job, a key skill in coding interviews.
"What if we used Merge Sort instead of Quick Sort? How would the time complexity and stability change?"
Practice
stable?Solution
Step 1: Understand stability in sorting
A stable sort keeps the relative order of items with equal keys unchanged.Step 2: Compare with other options
Speed, memory use, or sorting order do not define stability.Final Answer:
It keeps the original order of equal elements after sorting -> Option AQuick Check:
Stable sort = keeps equal elements order [OK]
- Confusing stability with speed
- Thinking stability means sorting ascending only
- Assuming stable sorts use less memory
Solution
Step 1: Understand JavaScript's default sort
By default,arr.sort()sorts elements as strings, not numbers.Step 2: Use compare function for numeric ascending
The compare function(a, b) => a - bsorts numbers ascending correctly.Final Answer:
arr.sort((a, b) => a - b) -> Option DQuick Check:
Numeric ascending sort uses (a, b) => a - b [OK]
- Using arr.sort() alone for numbers
- Using (a, b) => b - a for ascending order
- Using (a, b) => a + b which is invalid
const items = [
{name: 'apple', price: 50},
{name: 'banana', price: 20},
{name: 'cherry', price: 50},
{name: 'date', price: 20}
];
items.sort((a, b) => a.price - b.price);What will be the order of
items after sorting?Solution
Step 1: Understand the sort comparator
The comparator sorts by price ascending: 20 then 50.Step 2: Check stability of JavaScript sort
JavaScript's sort is stable in modern engines, so equal price items keep original order.Step 3: Apply stability to equal price items
For price 20, original order is banana then date; for 50, apple then cherry.Final Answer:
[{banana,20}, {date,20}, {apple,50}, {cherry,50}] -> Option CQuick Check:
Stable sort keeps equal price order [OK]
- Assuming unstable sort changes order of equal items
- Mixing up banana and date order
- Ignoring stability of JavaScript sort
const arr = ['bat', 'cat', 'apple', 'dog']; arr.sort((a, b) => a.length - b.length);
What is the main reason the original order of equal length strings might not be preserved?
Solution
Step 1: Check comparator correctness
The comparator(a, b) => a.length - b.lengthcorrectly compares string lengths.Step 2: Understand JavaScript sort stability
JavaScript's sort is stable in modern engines but may be unstable in older engines, causing order change.Final Answer:
JavaScript's sort is unstable in some engines -> Option BQuick Check:
Unstable sort breaks equal element order [OK]
- Blaming comparator function
- Thinking strings can't be sorted by length
- Assuming duplicates cause instability
name and score. You want to sort by score ascending but keep the original order for students with the same score. Which sorting algorithm should you choose and why?Solution
Step 1: Identify need for stability
We want to keep original order for equal scores, so stability is required.Step 2: Choose algorithm with stability and efficiency
MergeSort is stable and efficient (O(n log n)), suitable for this task.Step 3: Compare other options
QuickSort is fast but unstable; HeapSort is unstable; BubbleSort is stable but inefficient.Final Answer:
MergeSort, because it is stable and sorts efficiently -> Option AQuick Check:
Stable + efficient = MergeSort [OK]
- Choosing QuickSort ignoring instability
- Picking BubbleSort despite inefficiency
- Confusing HeapSort as stable
Ready to prove it?
Pass the test and this pattern moves unknown
