What if sorting could feel as natural as arranging your favorite cards one by one?
Why Insertion Sort Algorithm in DSA Rust?
Imagine you have a messy stack of playing cards and you want to arrange them in order by their numbers. Doing this by guessing where each card should go without a method can be confusing and slow.
Trying to sort cards by randomly swapping or checking all pairs takes a lot of time and mistakes happen easily. It's hard to keep track of what's already sorted and what's not.
Insertion sort helps by taking one card at a time and placing it exactly where it belongs among the cards already sorted. This way, the sorted part grows steadily and the process is clear and simple.
for i in 0..array.len() { for j in 0..array.len() { if array[i] < array[j] { array.swap(i, j); } } }
for i in 1..array.len() { let key = array[i]; let mut j = i; while j > 0 && array[j - 1] > key { array[j] = array[j - 1]; j -= 1; } array[j] = key; }
Insertion sort makes it easy to build a sorted list step-by-step, helping you understand sorting clearly and efficiently for small or nearly sorted data.
When organizing books on a shelf one by one, insertion sort is like placing each new book in the right spot among the already arranged books.
Manual sorting is slow and error-prone.
Insertion sort places items one by one in the correct position.
This method is simple and works well for small or mostly sorted data.
Practice
Insertion Sort algorithm?Solution
Step 1: Understand insertion sort process
Insertion sort builds the sorted list by taking one element at a time and placing it in the correct position among the already sorted elements.Step 2: Compare with other sorting methods
Unlike divide and conquer (merge sort) or swapping adjacent elements (bubble sort), insertion sort inserts elements directly into their correct place.Final Answer:
Build the sorted array one element at a time by inserting elements in their correct position -> Option BQuick Check:
Insertion sort = Insert elements correctly one by one [OK]
- Confusing insertion sort with bubble sort
- Thinking it divides array like merge sort
- Assuming it swaps only smallest elements
Solution
Step 1: Identify insertion sort loop start
Insertion sort starts from the second element (index 1) because the first element is considered sorted.Step 2: Check Rust range syntax
The range 1..arr.len() correctly iterates from index 1 to the last index (exclusive of arr.len()).Final Answer:
for i in 1..arr.len() { -> Option AQuick Check:
Start loop at 1 for insertion sort [OK]
- Starting loop at 0 instead of 1
- Using reversed range incorrectly
- Off-by-one errors in range
arr = [4, 3, 1, 5]?
let mut arr = vec![4, 3, 1, 5];
for i in 1..arr.len() {
let key = arr[i];
let mut j = i;
while j > 0 && arr[j - 1] > key {
arr[j] = arr[j - 1];
j -= 1;
}
arr[j] = key;
}
println!("{:?}", arr);Solution
Step 1: Trace first iteration (i=1)
key=3, compare with 4; 4 > 3 so shift 4 right, insert 3 at index 0. Array: [3,4,1,5]Step 2: Trace second iteration (i=2)
key=1, compare with 4 and 3; both >1 so shift them right, insert 1 at index 0. Array: [1,3,4,5]Step 3: Trace third iteration (i=3)
key=5, compare with 4; 4 < 5 so no shift, insert 5 at index 3. Array unchanged: [1,3,4,5]Final Answer:
[1, 3, 4, 5] -> Option CQuick Check:
Sorted array after insertion sort = [1, 3, 4, 5] [OK]
- Not shifting elements correctly
- Off-by-one errors in while loop
- Printing original array without sorting
let mut arr = vec![2, 5, 3];
for i in 1..arr.len() {
let key = arr[i];
let mut j = i - 1;
while j >= 0 && arr[j] > key {
arr[j + 1] = arr[j];
j -= 1;
}
arr[j + 1] = key;
}Solution
Step 1: Analyze variable j type and condition
In Rust, usize is unsigned, so j >= 0 is always true, causing infinite loop when j underflows.Step 2: Understand while loop behavior
When j reaches 0 and decrements, it wraps to a large number, so loop never ends.Final Answer:
The variable j is unsigned and j >= 0 check causes infinite loop -> Option DQuick Check:
Unsigned j with j >= 0 causes infinite loop [OK]
- Ignoring unsigned integer wrap-around
- Assuming j can be negative
- Not using a different loop condition
Vec<(i32, String)> by the integer value. Which change is needed in the comparison inside the while loop?Solution
Step 1: Understand tuple sorting by first element
To sort by the integer part of the tuple, compare the first element (.0) of each tuple.Step 2: Modify comparison in while loop
Replacearr[j - 1] > keywitharr[j - 1].0 > key.0to compare integers correctly.Final Answer:
Changearr[j - 1] > keytoarr[j - 1].0 > key.0-> Option AQuick Check:
Compare tuple first elements for sorting [OK]
- Comparing string part instead of integer
- Assuming tuples compare by second element automatically
- Using length of string for comparison
Ready to prove it?
Pass the test and this pattern moves unknown
