×

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

ComplexityBest caseAverage caseWorst case
TimeO(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.

141819372340293011

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

Shell Sort in DS

    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.

Shell Sort in DS

 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 9th index in the above array so we will just have index 1 and 5.

Shell Sort in DS

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.

Shell Sort in DS

  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.

Shell Sort in DS

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.

Shell Sort in DS

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.

Shell Sort in DS

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

Shell Sort in DS

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

Shell Sort in DS

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

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

Shell Sort in DS

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

Shell Sort in DS

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

Shell Sort in DS

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

Shell Sort in DS

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

Shell Sort in DS

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); 
}

Related Topics

Convert binary tree to a doubly linked list

Implementation //creating a C++ program for the transition of a binary tree into a linked list. #include <iostream> using namespace std; /* Firstly, let’s create a binary tree that will help us in setting...

4 minutes read.

FLEX (Fast Lexical Analyzer Generator)

FLEX stands for Fast Lexical Analyzer Generator. Around 1987, Vern Paxson created Flex in C with a great deal of input and inspiration from Van Jacobson. Van Jacobson's approach is...

3 minutes read.

Binary Tree Implementation Using Arrays

Implementation Converting a binary tree into a list of arrays is one interesting problem. Let us see that in depth. In this section, we will see the implementation of the binary Trees...

4 minutes read.

Spanning Tree

Spanning Tree: The spanning tree is a subset of the graph. It is a non-cyclic graph. If any node in the spanning tree is truncated, the entire graph fails. There are...

10 minutes read.

Count pairs from two linked lists whose sum is equal to a given value

Count pairs from two linked lists whose sum is equal to a given value In this problem, we have given two linked lists of size n1 and n2 with distinct elements...

4 minutes read.

Implementation of Queue

Implementation of queue: We can implement the queue through the array and linked list. An array is the easiest way to implement the queue. When a queue is created with the...

7 minutes read.

Linked List Data Structure

Linked list in DS: The linked list is a non-primitive and linear data structure. It is a list of a particular type of data element that is connected to each...

3 minutes read.

Difference between Stack and Queue

In this article, we will learn about the major differences between Stack and Queue data structures. What is a stack? Stack – A stack is an abstract data structure defined as the...

3 minutes read.

Advantages and Disadvantages of Linked List

Advantages of Linked List The linked list is a dynamic data structure.You can also decrease and increase the linked list at run-time. That is, you can allocate and deallocate memory at...

3 minutes read.

Heap Data Structure

In this article, we will learn in detail about Heap (Min heap and Max heap). Before going to the main topics, let’s have a look at what is complete binary...

19 minutes read.

Print kth least significant bit number

You have given a number and you have to find out the kth least significant bit of this number. K will be given to you.  The bit will be from...

3 minutes read.

Horizontal and Vertical Scaling

Being a software engineer, you would have designed a website or application and deployed it on any server. Imagine that the developed application starts getting popular, and many users engage...

6 minutes read.

What is a full Binary Tree?

A full binary tree is considered to be a special kind of binary tree in which every single node or leaf node present either contains two children or no children...

4 minutes read.

Bucket Sort

Bucket Sort: In the sorting algorithm, we create buckets and put elements into them. We can apply some sorting algorithm (insertion sort) to sort the elements in each bucket. Finally,...

4 minutes read.

Fundamental of Algorithms

An algorithm is a part of any programming solution or coding. If we have to make a solution then first we have to think of a clear idea about the...

13 minutes read.

Binary Tree in Data Structures

What is a Binary Tree in Data Structures? The term binary itself means bi, which implies two of anything. So very clearly, we know we present the trees in the form...

6 minutes read.

B+ Tree Program in Q language

A B+ tree is just an improvised version of a self-balancing and well-maintained tree in which all the key values that hold valuable information is present at the bottom, which...

9 minutes read.

Asynchronous advantage actor-critic (A3C) Algorithm

The Asynchronous advantage actor-critic (A3C) Algorithm is one of the latest algorithms developed by the Artificial Intelligence division, Deep Mind at Google. It is used for the Deep Reinforcement Learning...

3 minutes read.

Rotate a Singly Linked List

Rotate a Singly Linked List This article will explain how we can rotate the singly linked list. Here we have given a singly linked list, and we need to rotate this...

4 minutes read.

Applications of trees in data structures

Data structures Storage used to organize and store data is known as the data structure. It is a method of managing computerized data to translate or retrieve it more efficiently. A...

7 minutes read.