Selection Sort Algorithm in DSA Go - Time & Space Complexity
We want to understand how the time taken by Selection Sort changes as the list size grows.
How many steps does it take to sort a list of numbers?
Analyze the time complexity of the following code snippet.
func selectionSort(arr []int) {
n := len(arr)
for i := 0; i < n-1; i++ {
minIndex := i
for j := i + 1; j < n; j++ {
if arr[j] < arr[minIndex] {
minIndex = j
}
}
arr[i], arr[minIndex] = arr[minIndex], arr[i]
}
}
This code sorts an array by repeatedly finding the smallest remaining element and swapping it to the front.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The inner loop that scans the unsorted part to find the minimum element.
- How many times: The outer loop runs n-1 times, and for each, the inner loop runs fewer times, roughly n-i-1 times.
As the list grows, the number of comparisons grows much faster because each new element requires scanning the rest.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 45 comparisons |
| 100 | About 4,950 comparisons |
| 1000 | About 499,500 comparisons |
Pattern observation: The operations grow roughly by the square of the input size.
Time Complexity: O(n²)
This means if you double the list size, the work roughly quadruples.
[X] Wrong: "Selection Sort is fast because it only swaps once per outer loop."
[OK] Correct: While swaps are fewer, the many comparisons inside the inner loop still take a lot of time, dominating the cost.
Understanding Selection Sort's time complexity helps you compare it with faster sorting methods and shows your grasp of algorithm efficiency.
"What if we changed the inner loop to stop early when the list is already sorted? How would the time complexity change?"
Practice
Selection Sort algorithm?Solution
Step 1: Understand selection sort process
Selection sort finds the smallest element in the unsorted part and swaps it with the first unsorted element.Step 2: Compare with other sorting methods
Other options describe merge sort, bubble sort, and quicksort, which are different algorithms.Final Answer:
Repeatedly find the smallest element and move it to the front -> Option AQuick Check:
Selection sort = find smallest and swap [OK]
- Confusing selection sort with bubble sort
- Thinking it divides list like merge sort
- Assuming it uses a pivot like quicksort
arr of length n?Solution
Step 1: Understand loop range for selection sort
The outer loop runs from 0 to n-2 because the last element will be sorted automatically after previous passes.Step 2: Check each option's correctness
for i := 0; i < n-1; i++ { usesi < n-1, which is correct. Others either go out of bounds or start at wrong index.Final Answer:
for i := 0; i < n-1; i++ { -> Option BQuick Check:
Outer loop runs 0 to n-2 [OK]
- Using <= n causing index out of range
- Starting loop at 1 instead of 0
- Loop running too many times
arr := []int{29, 10, 14, 37, 13}
n := len(arr)
minIndex := 0
for j := 1; j < n; j++ {
if arr[j] < arr[minIndex] {
minIndex = j
}
}
arr[0], arr[minIndex] = arr[minIndex], arr[0]
fmt.Println(arr)Solution
Step 1: Find minimum element index in full array
Minimum element is 10 at index 1, so minIndex = 1.Step 2: Swap arr[0] and arr[minIndex]
Swap arr[0] (29) with arr[1] (10), resulting in [10 29 14 37 13].Final Answer:
[10 29 14 37 13] -> Option DQuick Check:
First pass places smallest element at front [OK]
- Not swapping elements after finding minimum
- Confusing minIndex with current index
- Printing array before swap
func selectionSort(arr []int) {
n := len(arr)
for i := 0; i < n; i++ {
minIndex := i
for j := i + 1; j <= n; j++ {
if arr[j] < arr[minIndex] {
minIndex = j
}
}
arr[i], arr[minIndex] = arr[minIndex], arr[i]
}
}Solution
Step 1: Check inner loop boundary
Inner loop uses j <= n, which causes index out of range error because valid indices are 0 to n-1.Step 2: Correct inner loop condition
It should be j < n to stay within array bounds.Final Answer:
Inner loop condition should be j < n, not j <= n -> Option CQuick Check:
Array indices go from 0 to n-1 [OK]
- Using <= n causing runtime panic
- Initializing minIndex outside outer loop
- Unnecessary swap checks
arr := []int{64, 25, 12, 22, 11}, after how many swaps will the array be fully sorted using selection sort, and what will be the final sorted array?Solution
Step 1: Count swaps in each selection sort pass
Pass 1: swap 64 and 11 -> [11 25 12 22 64]
Pass 2: swap 25 and 12 -> [11 12 25 22 64]
Pass 3: swap 25 and 22 -> [11 12 22 25 64]
Pass 4: swap 25 and 25 (no change, but swap counted as 1)
Total swaps = 4 (last swap is with itself, usually counted as swap)Step 2: Final sorted array
The array after sorting is [11 12 22 25 64].Final Answer:
4 swaps; [11 12 22 25 64] -> Option AQuick Check:
Selection sort swaps once per pass, total n-1 swaps [OK]
- Counting swaps incorrectly when swapping element with itself
- Assuming more swaps than passes
- Confusing sorted array with original
Ready to prove it?
Pass the test and this pattern moves unknown
