Shell Sort Algorithm in DSA C++ - 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.
void shellSort(int arr[], int n) {
for (int gap = n/2; gap > 0; gap /= 2) {
for (int i = gap; i < n; i++) {
int temp = arr[i];
int 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.
- How many times: It runs multiple times for each gap size, and the gap sizes reduce by about half each time.
As the list gets bigger, the number of comparisons and shifts grows, but not as fast as simple sorting methods.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 20 to 30 operations |
| 100 | Several hundred operations |
| 1000 | Thousands of operations, but less than n squared |
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 a straight line but much slower than the square of the input size.
[X] Wrong: "Shell Sort always runs in quadratic time like Bubble Sort."
[OK] Correct: Shell Sort uses gaps to reduce the number of comparisons, so it usually runs faster than simple quadratic sorts.
Understanding Shell Sort's time complexity helps you explain how improving sorting steps can speed up algorithms, a useful skill in interviews.
"What if we changed the gap sequence to use a different pattern, like 3x+1 increments? How would the time complexity change?"
Practice
Shell Sort algorithm?Solution
Step 1: Understand Shell Sort's approach
Shell Sort starts by comparing elements far apart using a gap, not just neighbors.Step 2: Gap reduction and sorting
The gap reduces gradually until it becomes 1, performing insertion sort at each stage.Final Answer:
It sorts elements by comparing distant elements and gradually reducing the gap. -> Option DQuick Check:
Shell Sort = gap-based sorting [OK]
- Thinking Shell Sort only swaps adjacent elements
- Confusing Shell Sort with merge or heap sort
- Ignoring the gap reduction step
n in C++?Solution
Step 1: Identify the common gap initialization
Shell Sort commonly starts with gap as half the array size, i.e., n/2.Step 2: Check other options
Multiplying or adding to n is incorrect; starting at 1 skips the gap sorting steps.Final Answer:
int gap = n / 2; -> Option AQuick Check:
Gap starts at half array size [OK]
- Starting gap at 1 instead of n/2
- Using gap larger than array size
- Confusing gap initialization with loop counters
arr = {9, 8, 3, 7, 5, 6, 4, 1}?Solution
Step 1: Apply Shell Sort steps on the array
Start with gap = 4 (8/2), sort elements 4 apart, then gap = 2, then gap = 1.Step 2: Final sorted array
After all gap reductions and sorting, the array becomes fully sorted: [1, 3, 4, 5, 6, 7, 8, 9].Final Answer:
[1, 3, 4, 5, 6, 7, 8, 9] -> Option AQuick Check:
Shell Sort fully sorts array ascending [OK]
- Confusing partial sorted arrays as final output
- Reversing the array order
- Ignoring gap-based sorting steps
void shellSort(int arr[], int n) {
for (int gap = n / 2; gap > 0; gap /= 2) {
for (int i = gap; i < n; i++) {
int temp = arr[i];
int j = i;
while (j >= gap && arr[j - gap] > temp) {
arr[j] = arr[j - gap];
j -= gap;
}
arr[j] = temp;
}
}
}Solution
Step 1: Review gap initialization and update
Gap starts at n/2 and halves each iteration, which is correct for Shell Sort.Step 2: Check inner loop and conditions
The while loop uses j >= gap to avoid out-of-bound and correctly shifts elements.Final Answer:
No error; the code correctly implements Shell Sort. -> Option BQuick Check:
Code matches Shell Sort logic [OK]
- Changing gap update to subtract 1 breaks algorithm
- Using incorrect while loop boundary causes errors
- Starting gap at n causes out-of-bound issues
arr = {23, 12, 1, 8, 34, 54, 2, 3}, how many times will the inner while loop execute during the first gap iteration (gap = 4) in Shell Sort?Solution
Step 1: Identify elements compared with gap = 4
Pairs compared: (23, 34), (12, 54), (1, 2), (8, 3).Step 2: Count while loop executions
Only pairs where left element > right element cause shifts. Here, (23 > 34) no, (12 > 54) no, (1 > 2) no, (8 > 3) yes. For (8,3), shifting occurs once. Also, elements at indices 4 to 7 are checked, total 4 iterations of the outer loop, but only 1 inner while loop execution occurs.Final Answer:
3 times -> Option CQuick Check:
Count actual inner while loop executions, not just comparisons [OK]
- Counting only swaps, not all while loop checks
- Ignoring elements beyond first gap iteration
- Misunderstanding gap-based comparisons
Ready to prove it?
Pass the test and this pattern moves unknown
