Shell Sort Algorithm in DSA Javascript - Time & Space Complexity
We want to understand how the time taken by Shell Sort changes as the list size grows.
How does the number of steps increase when sorting bigger lists?
Analyze the time complexity of the following Shell Sort code.
function shellSort(arr) {
let n = arr.length;
for (let gap = Math.floor(n / 2); gap > 0; gap = Math.floor(gap / 2)) {
for (let i = gap; i < n; i++) {
let temp = arr[i];
let j = i;
while (j >= gap && arr[j - gap] > temp) {
arr[j] = arr[j - gap];
j -= gap;
}
arr[j] = temp;
}
}
}
This code sorts an array by comparing elements far apart and gradually reducing the gap.
Look at the loops and repeated comparisons.
- Primary operation: The inner while loop that shifts elements to insert the current element in the right place.
- How many times: This depends on the gap and how many elements need shifting; it repeats for each element and for each gap size.
As the list grows, the number of comparisons and shifts grows too, but not as fast as simple sorting methods.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 20-30 operations |
| 100 | Few thousands of operations |
| 1000 | Hundreds of thousands of operations |
Pattern observation: The operations grow faster than linear but slower than quadratic, improving efficiency over simple sorts.
Time Complexity: O(n^{1.5})
This means the time grows faster than the list size but much slower than simple sorting methods like bubble sort.
[X] Wrong: "Shell Sort always runs in quadratic time like bubble sort."
[OK] Correct: Shell Sort uses gaps to reduce the number of shifts, so it usually runs faster than quadratic time, especially on larger lists.
Understanding Shell Sort's time complexity shows you how clever ideas can improve sorting speed, a useful skill for solving real problems efficiently.
"What if we changed the gap sequence to use a different pattern, like the Knuth sequence? How would the time complexity change?"
Practice
Shell Sort algorithm?Solution
Step 1: Understand Shell Sort concept
Shell Sort improves insertion sort by comparing elements far apart, reducing the gap over iterations.Step 2: Compare with other sorting methods
Unlike merge sort or heap sort, Shell Sort uses gap-based comparisons, not divide and conquer or heap structure.Final Answer:
It sorts elements by comparing distant elements and gradually reducing the gap. -> Option DQuick Check:
Shell Sort = gap-based comparisons [OK]
- Confusing Shell Sort with merge sort or quicksort
- Thinking it only swaps adjacent elements like bubble sort
- Assuming it uses a heap structure
Solution
Step 1: Identify typical gap initialization
Shell Sort usually starts with gap as half the array length, using Math.floor for integer division.Step 2: Check each option
let gap = Math.floor(array.length / 2); correctly sets gap to half length; others set invalid or zero gaps.Final Answer:
let gap = Math.floor(array.length / 2); -> Option AQuick Check:
Gap starts at half array length [OK]
- Setting gap to zero initially
- Using gap larger than array length
- Not using Math.floor for integer gap
[9, 8, 3, 7, 5, 6, 4, 1]?Solution
Step 1: Identify elements compared with gap 3
Elements compared are at indices (0,3,6) and (1,4,7) and (2,5). For example, 9 and 7 and 4; 8 and 5 and 1; 3 and 6.Step 2: Perform insertion sort on these groups
Sorting group (9,7,4) gives (4,7,9), (8,5,1) gives (1,5,8), (3,6) stays (3,6). After rearranging, array becomes [4,1,3,7,5,6,9,8].Final Answer:
[4, 1, 3, 7, 5, 6, 9, 8] -> Option CQuick Check:
Gap 3 pass sorts distant elements [OK]
- Not grouping elements by gap correctly
- Sorting entire array instead of gap groups
- Confusing indices during swaps
function shellSort(arr) {
let gap = Math.floor(arr.length / 2);
while (gap > 0) {
for (let i = gap; i < arr.length; i++) {
let temp = arr[i];
let j = i;
while (j >= gap && arr[j - gap] > temp) {
arr[j] = arr[j - gap];
j -= gap;
}
arr[j] = temp;
}
gap = gap / 2;
}
return arr;
}Solution
Step 1: Analyze gap update
The gap must be an integer; dividing by 2 without floor makes it a float, causing infinite loop.Step 2: Fix gap update
Using Math.floor ensures gap reduces properly and loop ends.Final Answer:
Change gap = gap / 2; to gap = Math.floor(gap / 2); -> Option BQuick Check:
Gap must be integer to avoid infinite loop [OK]
- Not flooring gap, causing infinite loop
- Changing loop conditions incorrectly
- Removing necessary inner loops
[23, 12, 1, 8, 34, 54, 2, 3], what will be the final sorted array after applying Shell Sort with gap sequence halving each time starting from Math.floor(length/2)?Solution
Step 1: Calculate initial gap and perform passes
Initial gap = 4. After sorting groups with gap 4, array partially sorted. Then gap = 2, then gap = 1 (final insertion sort).Step 2: Final sorted array after all passes
After all gap passes, array becomes fully sorted ascending: [1, 2, 3, 8, 12, 23, 34, 54].Final Answer:
[1, 2, 3, 8, 12, 23, 34, 54] -> Option AQuick Check:
Shell Sort fully sorts array ascending [OK]
- Stopping before gap reaches 1
- Misordering elements in final pass
- Confusing descending with ascending order
Ready to prove it?
Pass the test and this pattern moves unknown
