What is Insertion Sort?
Insertion Sort is a simple and intuitive comparison-based sorting algorithm. It works similarly to the way you might sort playing cards in your hands. It builds the sorted array (or list) one element at a time by comparing each new element with the elements already sorted and inserting it into the correct position. The algorithm maintains a sorted sublist in the lower positions of the array and progressively inserts the remaining unsorted elements into their correct positions.
How Insertion Sort Works ?
Insertion Sort works by iterating over the array and inserting each element into its correct position relative to the already sorted portion of the array.
Step-by-step explanation:
- Start from the second element (the first element is already sorted by itself).
- Compare the current element with the elements before it.
- If the current element is smaller than the element before it, shift the larger element one position to the right.
- Insert the current element at its correct position.
- Repeat this process for each element until the entire array is sorted.
Example of Insertion Sort
Let’s take an example of sorting the array [12, 11, 13, 5, 6]
:
- Initial List:
[12, 11, 13, 5, 6]
- First Pass (11):
- Compare 11 with 12. Since 11 is smaller, move 12 to the right and place 11 in the first position.
- Result:
[11, 12, 13, 5, 6]
- Second Pass (13):
- Compare 13 with 12. Since 13 is larger, no change is needed.
- Result:
[11, 12, 13, 5, 6]
- Third Pass (5):
- Compare 5 with 13, 12, and 11. Shift all of them to the right and place 5 in the first position.
- Result:
[5, 11, 12, 13, 6]
- Fourth Pass (6):
- Compare 6 with 13, 12, and 11. Shift 13 and 12 to the right, and place 6 after 5.
- Result:
[5, 6, 11, 12, 13]
Now, the array is sorted.
C++ Program to implement Insertion Sort Algorithm
#include <iostream>
using namespace std;
// Function to perform insertion sort
void insertionSort(int arr[], int n) {
// Traverse the array starting from the second element (index 1)
for (int i = 1; i < n; i++) {
int key = arr[i]; // The element to be placed in its correct position
int j = i - 1;
// Shift elements of arr[0..i-1] that are greater than key
// to one position ahead of their current position
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j = j - 1;
}
// Place the key at its correct position
arr[j + 1] = key;
}
}
// Function to print the array
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
cout << arr[i] << " ";
}
cout << endl;
}
// Main function
int main() {
int arr[] = {12, 11, 13, 5, 6};
int n = sizeof(arr) / sizeof(arr[0]);
cout << "Original array: ";
printArray(arr, n);
insertionSort(arr, n);
cout << "Sorted array: ";
printArray(arr, n);
return 0;
}
Java Program to implement Insertion Sort Algorithm
public class Main {
// Function to perform insertion sort
public static void insertionSort(int arr[]) {
int n = arr.length;
// Traverse the array starting from the second element (index 1)
for (int i = 1; i < n; i++) {
int key = arr[i]; // The element to be placed in its correct position
int j = i - 1;
// Shift elements of arr[0..i-1] that are greater than key
// to one position ahead of their current position
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j = j - 1;
}
// Place the key at its correct position
arr[j + 1] = key;
}
}
// Function to print the array
public static void printArray(int arr[]) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
// Main function
public static void main(String args[]) {
int arr[] = {12, 11, 13, 5, 6};
System.out.println("Original array:");
printArray(arr);
insertionSort(arr);
System.out.println("Sorted array:");
printArray(arr);
}
}
Python Program to implement Insertion Sort Algorithm
# Function to perform insertion sort
def insertion_sort(arr):
# Traverse the array starting from the second element (index 1)
for i in range(1, len(arr)):
key = arr[i] # The element to be placed in its correct position
j = i - 1
# Shift elements of arr[0..i-1] that are greater than key
# to one position ahead of their current position
while j >= 0 and arr[j] > key:
arr[j + 1] = arr[j]
j -= 1
# Place the key at its correct position
arr[j + 1] = key
# Function to print the array
def print_array(arr):
print(" ".join(map(str, arr)))
# Main function
if __name__ == "__main__":
arr = [12, 11, 13, 5, 6]
print("Original array:")
print_array(arr)
insertion_sort(arr)
print("Sorted array:")
print_array(arr)
Properties of Insertion Sort
- Time Complexity:
- Best Case: O(n) - when the array is already sorted.
- Average Case: O(n²)
- Worst Case: O(n²) - when the array is sorted in reverse order.
- Space Complexity: O(1) - Insertion Sort is an in-place sorting algorithm.
- Stability: Insertion Sort is a stable sorting algorithm, meaning it maintains the relative order of equal elements.
- Adaptability: Insertion Sort is adaptive. If the array is already sorted (or nearly sorted), it performs efficiently with fewer comparisons and swaps.
When to Use Insertion Sort ?
Insertion Sort is generally more efficient for small datasets or for datasets that are already mostly sorted. It is also used in hybrid algorithms, like Timsort, as a sorting mechanism for small subarrays.
Frequently Asked Questions (FAQs) about Insertion Sort Algorithm
Q1: What is the time complexity of Insertion Sort?
- A: The time complexity of Insertion Sort is O(n²) in the average and worst cases, and O(n) in the best case when the array is already sorted.
Q2: Is Insertion Sort a stable sorting algorithm?
- A: Yes, Insertion Sort is a stable sorting algorithm because it preserves the relative order of elements with equal values.
Q3: What is the space complexity of Insertion Sort?
- A: The space complexity of Insertion Sort is O(1), as it sorts the array in-place without using additional memory.
Q4: When is Insertion Sort efficient?
- A: Insertion Sort is efficient for small datasets and arrays that are already (or nearly) sorted. It is also adaptive, meaning it performs well when the data is partially sorted.
Q5: How does Insertion Sort compare to Bubble Sort and Selection Sort?
- A: Insertion Sort is generally more efficient than both Bubble Sort and Selection Sort for small arrays and nearly sorted data. While all three algorithms have a time complexity of O(n²) in the worst case, Insertion Sort has a best-case time complexity of O(n) when the array is already sorted.