# When to use each Sorting Algorithms | Set 2

Sorting is the process of arranging a set of data in a specific order, which may be numerical (ascending, descending) or lexicographical (alphabetical) order.

**Why Sorting Is Required?**

Sorting is very essential when there is a need to highly optimize the searching algorithm. For example, let’s assume two cases for searching for a certain element.**Case 1: **Searching for an element from a random set of elements. (Unsorted)**Case 2: **Searching for an element from an ordered set of elements. (Sorted)

It is obvious that it would be easier and faster to search for an element in case 2, as the elements are previously sorted, so searching would take less time.

**When To Use Each Sorting Algorithm?**

For sorting data, there are different algorithms available that can be used to sort the data, but the main question that arises is, how to select a suitable algorithm to achieve the highest possible efficiency?

Before selecting a sorting algorithm there are a few** **factors to consider:

**Size of data:**The total number of elements or data present can be large or small.**State of data:**Whether the data is completely random, partially sorted, or almost sorted.**Time and Space Complexity****:**The amount of time and space we need to invest in.

Let’s have a look at the various sorting algorithms:

**Heap Sort****: **It builds a binary heap data structure from the available elements and then uses the heap for sorting. It is a comparison-based (in-place) sorting algorithm with no quadratic worst-case running time. Heapsort can be used as per the below constraints:

- The best thing about this algorithm is that it doesn’t require any extra memory, so if there is a requirement for an algorithm with no extra space requirement, then one can go for heap sort.
- It exhibits consistent performance. So it performs well in the best, average, and worst cases. Because of its guaranteed performance, it is used in systems with critical response time.
- The heap sport is particularly suitable for sorting a huge list of elements.

**Time Complexity:**

**Best Case:**O(N*log N)**Average Case:**O(N*log N)**Worst Case:**O(N*log N)

**Space Complexity:** O(1)

**Shell Sort****:** It is an in-place comparison sort. This algorithm avoids large shifts, as in the case of insertion sort if the smaller value is to the far right and has to be moved to the far left. Shell sort is more efficient compared to insertion sort or bubble sort, and it is used when-

- Smaller value elements are towards the end of the array/list.
- When there is a large-sized array/list and the close elements are far apart, by this algorithm we can reduce the distance between these elements, so fewer swaps are required in this case.
- When a recursion exceeds a limit, then this algorithm can be used.

**Time Complexity:**

**Best Case:**O(N*log N)**Average Case:**Depends on the gap sequence**Worst Case:**O(N*log^{2}N)

**Space Complexity:** O(1)

**Radix Sort****: **It is a non-comparative sorting algorithm. It avoids comparison by creating and distributing elements into buckets according to the radix. It has a linear time complexity which is better than O(N*log N) of comparative sorting algorithms. Radix sort can be used as per the below constraints-

- When the repetition of elements is not much in the given lists, but the length of the elements is of the same range, then using radix sort is beneficial.
- Radix sort is widely used on data that can be sorted lexicographically.
- It is also applied to stably sort strings.

**Time Complexity:**

**Best Case:**O(N*K)**Average Case:**O(N*K)**Worst Case:**O(N*K)

**Space Complexity: **O(N + K)

**Bucket Sort****: **Bucket sort works by distributing the elements of an array into a number of buckets. Each bucket is then sorted individually and is appended into one array. It is quite a stable algorithm as once the elements are distributed into buckets, each bucket can be processed independently of the others. The bucket sort can be used as per the below constraints-

- It is used to speed up the sorting process because the process of placing items into buckets and then sorting them in smaller amounts is much faster than any other linear sorting algorithm such as the bubble sort.
- It is very useful when input is uniformly distributed over a range.
- Another advantage of bucket sort is that it can be used as an external sorting algorithm.

**Time Complexity:**

**Best Case:** O(N + K)**Average Case:** O(N)**Worst Case:** O(N^{2})

**Space Complexity: **O(N*K)

**Counting Sort****:** This algorithm sorts the elements of an array by counting the number of occurrences of each unique element in the array. It is often used as a subroutine in another sorting algorithm, such as radix sort, that can handle larger keys more efficiently. It is not a comparison sort. Counting sort can be used as per the below constraints:

- It is useful when the difference between different keys (small numbers) is not so big.
- When the list/array contains a limited range of numbers and is repeating a lot, in that case, counting sort will be helpful.
- It is a stable sorting algorithm.

**Time Complexity:**

**Best Case:**O(N + K)**Average Case:**O(N + K)**Worst Case:**O(N + K)

**Space Complexity: **O(N + K)

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the **DSA Self Paced Course** at a student-friendly price and become industry ready. To complete your preparation from learning a language to DS Algo and many more, please refer **Complete Interview Preparation Course****.**

In case you wish to attend **live classes **with experts, please refer **DSA Live Classes for Working Professionals **and **Competitive Programming Live for Students**.