Introduction
Insertion Sort is a simple and intuitive comparison-based sorting algorithm. It builds the final sorted array one item at a time, with the assumption that the initial part of the array is already sorted. It is particularly useful for small datasets or nearly sorted data.
Key Concepts
- In-place Sorting: Insertion Sort sorts the array without requiring additional storage.
- Stable Sorting: It maintains the relative order of equal elements.
- Adaptive: Efficient for data sets that are already substantially sorted.
Algorithm Steps
- Start with the second element (index 1) as the key.
- Compare the key with the elements before it.
- Shift elements that are greater than the key to one position ahead.
- Insert the key into its correct position.
- Repeat the process for all elements.
Pseudocode
for i from 1 to length(A) - 1 key = A[i] j = i - 1 while j >= 0 and A[j] > key A[j + 1] = A[j] j = j - 1 A[j + 1] = key
Example
Consider the array: [5, 2, 9, 1, 5, 6]
- Initial array:
[5, 2, 9, 1, 5, 6]
- Key = 2, Compare with 5, Shift 5:
[5, 5, 9, 1, 5, 6]
, Insert 2:[2, 5, 9, 1, 5, 6]
- Key = 9, No shift needed:
[2, 5, 9, 1, 5, 6]
- Key = 1, Compare and shift:
[2, 5, 9, 9, 5, 6]
,[2, 5, 5, 9, 5, 6]
,[2, 2, 5, 9, 5, 6]
, Insert 1:[1, 2, 5, 9, 5, 6]
- Key = 5, Compare and shift:
[1, 2, 5, 9, 9, 6]
, Insert 5:[1, 2, 5, 5, 9, 6]
- Key = 6, Compare and shift:
[1, 2, 5, 5, 9, 9]
, Insert 6:[1, 2, 5, 5, 6, 9]
Final sorted array: [1, 2, 5, 5, 6, 9]
Python Implementation
def insertion_sort(arr): for i in range(1, len(arr)): key = arr[i] j = i - 1 while j >= 0 and key < arr[j]: arr[j + 1] = arr[j] j -= 1 arr[j + 1] = key # Example usage arr = [5, 2, 9, 1, 5, 6] insertion_sort(arr) print("Sorted array:", arr)
Explanation of Code
- Line 1: Define the
insertion_sort
function that takes an arrayarr
as input. - Line 2: Loop through the array starting from the second element.
- Line 3: Set the current element as the key.
- Line 4: Initialize
j
to the index before the key. - Line 5-7: Shift elements greater than the key to the right.
- Line 8: Insert the key into its correct position.
Practical Exercises
Exercise 1
Sort the following array using Insertion Sort: [8, 4, 3, 7, 6, 5, 2, 1]
Solution
Expected Output: [1, 2, 3, 4, 5, 6, 7, 8]
Exercise 2
Write a function to sort a list of strings using Insertion Sort.
Solution
def insertion_sort_strings(arr): for i in range(1, len(arr)): key = arr[i] j = i - 1 while j >= 0 and key < arr[j]: arr[j + 1] = arr[j] j -= 1 arr[j + 1] = key # Example usage arr = ["banana", "apple", "cherry", "date"] insertion_sort_strings(arr) print("Sorted array:", arr)
Expected Output: ['apple', 'banana', 'cherry', 'date']
Common Mistakes and Tips
- Off-by-One Errors: Ensure the loop indices are correctly set to avoid out-of-bound errors.
- Unnecessary Comparisons: Avoid comparing elements that are already in the correct order.
- Handling Edge Cases: Consider edge cases such as empty arrays or arrays with a single element.
Conclusion
Insertion Sort is a fundamental algorithm that is easy to understand and implement. While it may not be the most efficient for large datasets, it is a valuable tool for small or nearly sorted arrays. Understanding Insertion Sort provides a solid foundation for learning more complex sorting algorithms.