# Shell Sort

**Shell Sort**: Shell sort is a sorting algorithm. It is an extended version of the insertion sort.

- In this sorting, we compare the elements that are distant apart rather than the adjacent.
- We start by comparing elements that are at a certain distance apart. So, if there are N elements then we start with a value gap < N.
- In each iteration we keep decreasing the value of the gap until the difference becomes 1.
- In the last iteration, the shell sort acts as an insertion-type.

### Complexity table of shell sort

Complexity | Best case | Average case | Worst case |

Time | O(n) | O((nlog(n))^{2}) | O((nlog(n))^{2}) |

Space | O(1) |

### Algorithm of shell sort

Shell_Sort (array, size) for interval i ? size /2 down to 1. for each interval "i" in the array. sort all the elements at interval "i". end Shell_Sort.

### Shell sort example

Suppose you have the following array, which you have to sort.

14 | 18 | 19 | 37 | 23 | 40 | 29 | 30 | 11 |

The size of array is 9, so n = 9.

Now, find the value of the Gap.

Gap = floor(n / 2)

= floor (9 / 2)

= floor(4.5)

= 4

Pass = 1 Gap = 4

Gap 4 means, if we consider the first element at index 0 then next element will be at index 0+4 = 4., and third element will be at index 4 + 4 = 8.

Similarly, if we consider the element at index 1 then next element will be at index 1 + 4 = 5, and third element will be at index 5 + 4 = 9. But there is no 9^{th} index in the above array so we will just have index 1 and 5.

Similarly, if we consider the element at index 2, 3, and 4 respectively then next element will be at index 2 + 4 = 6, 3 + 4 = 7, and 4 + 4 = 8 respectively.

Compare the elements.

A[0] > A[4] = 14 > 23 // false

A[1] > A[5] = 18 > 40 // false

A[2] > A[6] = 19 > 29 // false

A[3] > A[7] = 37 > 30 // true i.e., swap the both element positions.

A[4] > A[8] = 23 > 11 // true i.e., swap the both element positions.

A[1] > A[4] = 14 > 11 // true i.e., swap the both element positions.

Pass 1 is complete.

Pass 2: Gap = floor(Gap / 2)

Gap = floor(4 / 2) // in pass 1,

Gap was 4.

Gap = 2

Gap 2 means, if we consider the first element at index 0 then next element will be at index 0+2 = 2, and similarly this process applied till the end of index.

Compare the elements.

A[0] > A[2] = 11 > 19 // false

A[]1 > A[3] = 18 > 30 // false

A[2] > A[4] = 19 > 14 // true, i.e. swap the both element positions.

A[1] > A[2] = 11 > 14 // false

A[3] > A[5] = 30 > 40 //false

A[4] > A[6] = 19 > 29 // false

A[5] > A[7] = 40 > 37 // true, i.e. swap the both element positions.

A[3] > A[5] = 30 > 37 // false

A[6] > A[8] = 29 > 23 // true, i.e. swap the both element positions.

A[4] > A[6] = 19 > 23 // false

Pass 2 is complete.

Pass 3: Gap = floor(Gap/2)

Gap = floor(2 / 2) // in pass 2, Gap was 2.

Gap = 1 // i.e. last pass when gap is 1, shell sort is like the insertion sort. Compare the elements.

A[0] > A[1] = 11 > 18 // false

A[1] > A[2] = 18 > 14 // true i.e. swap the both element positions.

A[0] > A[1] = 11 > 14 // false

A[2] > A[3] = 18 > 30 // false A[3] > A[4] = 30 > 19 // true i.e. swap the both element positions. A[2] > A[3] = 18 > 19 // false

A[4] > A[5] = 30 > 37 // false A[5] > A[6] = 37 > 23 // true i.e. swap the both element positions. A[4] > A[5] = 30 > 23 // true i.e. swap the both element positions. A[3] > A[4] = 19 > 23 // false

A[6] > A[7] = 37 > 40 // false A[7] > A[8] = 40 > 29 // true i.e. swap the both element positions. A[6] > A[7] = 37 > 29 // true i.e. swap the both element positions. A[5] > A[6] = 30 > 29 // true i.e. swap the both element positions. A[4] > A[5] = 23 > 29 // false

Pass 3 is complete, and array is fully sorted.

### Shell sort program in C language:

#include <stdio.h> // Shell sort void shellSort(int array[], int n) { // Rearrange elements at each n/2, n/4, n/8, ... intervals for (int gap = n / 2; gap > 0; gap /= 2) { for (int i = gap; i < n; i += 1) { int temp = array[i]; int j; for (j = i; j >= gap && array[j - gap] > temp; j -= gap) { array[j] = array[j - gap]; } array[j] = temp; } } } // Print an array void printArray(int array[], int size) { for (int i = 0; i < size; ++i) { printf("%d ", array[i]); } printf("\n"); } // Driver code int main() { int data[] = {9, 8, 3, 7, 5, 6, 4, 1}; int size = sizeof(data) / sizeof(data[0]); shellSort(data, size); printf("Sorted array: \n"); printArray(data, size); }