 # Algorithms Explained With Their Complexities | Top 5

It is equally important to have a good understanding of standard algorithms as it is to pick the right data structure. If you’re interested in becoming a computer programmer but don’t know where to start, let’s just say these are algorithms and data structures.

It won’t take long for you to begin to see these pillars of programming everywhere you look. You will be able to fuel your career as a software engineer by learning more algorithms and data structures.
Firstly, let’s take a closer look at the Search and Sort algorithms, two classes of algorithms you simply cannot do without. After that, let’s look at all the other possibilities, including trees, graphs, dynamic programming, and so much more.

Also read: Top Android App Development Companies in the USA

## 1. Binary Search Algorithm

Binary Search Approach: Binary Search is a search algorithm for sorted arrays that involves dividing the interval of each search in half repeatedly. By using the sorting information within the array, binary search reduces the complexity to O(Log n). Steps involved in Binary Search include:

The interval should cover the entire array.
The interval should be narrowed to the lower half of the search key value that is less than the item in the middle of the interval.
Otherwise, narrow it down.
Repeat until the interval is empty or the value is found.

### Binary Search complexity

Taking the best case, the average case, and the worst case, let’s examine the time complexity of Binary search. Let us also examine its space complexity.

Best Case Complexity – The best case for binary search is when the element to search occurs in the first comparison, that is if the first middle element is the element to search. Binary search has O(1) complexity in the best case.
Average Case Complexity – The average case time complexity of Binary search is O(logn).
Worst-Case Complexity – The worst-case scenario in Binary search is that the search space needs to be reduced until it has only one element. Binary search has a worst-case time complexity of O(logn).

The breadth-first search (BFS) is a way to traverse or explore tree or graph structures. A search tree begins by exploring the nodes closest to the root (or a ‘search key’) and then moves to those closer to the next level neighbors.

Among the many ways of traversing a graph, BFS is the most popular. In this method, all vertices of a tree or graph are searched recursively. A vertex in the graph is divided into two categories – visited and unvisited by BFS. An algorithm selects a node in a graph and then visits all the adjacent nodes to the node that was selected.

### The complexity of the BFS algorithm

As BFS relies on data structures to represent graphs, its time complexity varies. Since the BFS algorithm explores every edge and node, its time complexity is O(V+E). Graphs have an O(V) number of vertex and an O(E) number of edges.

Based on the number of vertices in the model, the space complexity of BFS can be expressed as O(V).

## 3. Depth First Search (DFS)

An algorithm known as Depth First Search (DFS) starts with the primary node of the graph G, and then goes deeper and deeper until it finds the node with no children, the goal node. After reaching the dead end, the algorithm backtracks to the most recent node, which is yet to be explored completely.

In DFS, stacks are used as data structures. BFS algorithms are similar to DFS algorithms. A discovery edge in DFS leads to an unvisited node, while a block edge is a route that leads to an already visited node.

Take the index of the node and an array of visited nodes and create a recursive function.

Mark the current node as visited and print it.
Call the recursive function with the index of each adjacent node after traversing all the adjacent and unmarked nodes.

### Complexity Analysis

Time complexity: The graph has O (V + E), i.e. O (V + E); V is the number of vertices and E is the number of edges.

Space Complexity: O (V), as it is necessary to visit an extra visited array of size V.

## 4. Merge sort

Divide and conquer is the principle behind merge sorting. Students will find this article helpful and interesting since they might face questions relating to merging sort in their exams. The topic of sorting algorithms is frequently discussed in coding and technical interviews for software engineers. Therefore, the topic should be discussed.

Using a divide and conquer approach to sort the elements, merge sort is similar to quicksort. Its efficiency makes it a favorite sorting algorithm. The function splits the given list into two equal halves, calls itself twice for each half, and then combines both sorted halves once again. To perform the merging, we need the merge () function.

Each sub-list is divided into halves again and again until it cannot be further divided. In the next step, we combine the two lists with one element into two-element lists, sorting them as we go. As soon as we have sorted two-element pairs, we merge them into four-element lists, and so on until we have sorted lists.

### Complexity Analysis

Best Case Complexity – This occurs when the array is already sorted, i.e. there is no need to sort it. Merge sort has a time complexity of O (n*logn).

Average Case Complexity- It occurs when the array elements are arranged in a manner that isn’t logically ascending or descending. It is estimated that the average case time complexity of merge sort is O (n*logn).

Worst Case Complexity – In this case, array elements must be sorted in reverse order. Therefore, suppose you have to sort an array’s elements in ascending order, but they are arranged in descending order. Merge sort has an O (n*logn) worst-case complexity.

## 5. Quick Sort Algorithm

Divide and conquer is the basis of Quicksort. Dividing an array into smaller sub-arrays and recursively sorting them is the hallmark of divide-and-conquer algorithms. The process consists of three steps:
Pivot selection: Choose an element from the array, called a pivot (normally the leftmost or rightmost element of a partition).

Partitioning: Arrange the elements so that those whose values are lower than the pivot come before the pivot. If the pivot’s value is greater, the elements come after it. Equal values can be expressed either way. The pivot is finally in position after this partitioning.

Recur: Repeat the above steps for each sub-array of elements that has fewer values than the pivot, and separately for each sub-array with greater values.

### Complexity Analysis

Best Case Complexity – When the pivot element is in the middle or close to the middle of a Quicksort, the best-case occurs. Quicksort has a best-case time complexity of O (n*logn).

Average Case Complexity- This occurs when the array elements are arranged in a jumbled order that isn’t ascending or descending properly. Quicksort has an average case time complexity of O(n*logn).

Worst Case Complexity – The worst-case in a quick sort occurs when either the largest element or the smallest element is the pivot element. It would be the worst-case if the pivot element was always the last element since the array will already be sorted either ascending or descending. O (n2) is the worst-case time complexity for quicksort.

Despite its higher worst-case complexity than methods such as merge sort and heap sort, quicksort is still a faster sorting algorithm in practice. Quicksort rarely faces a worst-case scenario because the pivot selection can be changed to accommodate different implementations. Picking the right pivot element can help avoid the worst-case in quicksort.

Share