Bird
Raised Fist0
DSA Rustprogramming~5 mins

Selection Sort Algorithm in DSA Rust - Time & Space Complexity

Choose your learning style10 modes available
Time Complexity: Selection Sort Algorithm
O(n²)
Understanding Time Complexity

We want to understand how the time needed to sort a list using selection sort changes as the list gets bigger.

How does the number of steps grow when the input size increases?

Scenario Under Consideration

Analyze the time complexity of the following code snippet.


fn selection_sort(arr: &mut [i32]) {
    let n = arr.len();
    for i in 0..n {
        let mut min_index = i;
        for j in (i + 1)..n {
            if arr[j] < arr[min_index] {
                min_index = j;
            }
        }
        arr.swap(i, min_index);
    }
}
    

This code sorts an array by repeatedly finding the smallest element from the unsorted part and swapping it to the front.

Identify Repeating Operations

Identify the loops, recursion, array traversals that repeat.

  • Primary operation: The inner loop compares elements to find the minimum.
  • How many times: The outer loop runs n times, and for each outer loop, the inner loop runs fewer times, roughly n, n-1, n-2, ... down to 1.
How Execution Grows With Input

As the list size grows, the number of comparisons grows roughly by the square of the size.

Input Size (n)Approx. Operations
10About 45 comparisons
100About 4,950 comparisons
1000About 499,500 comparisons

Pattern observation: When input size doubles, operations roughly quadruple, showing a square growth pattern.

Final Time Complexity

Time Complexity: O(n²)

This means the time needed grows roughly with the square of the input size, so doubling the list size makes the work about four times bigger.

Common Mistake

[X] Wrong: "Selection sort is fast because it only swaps once per outer loop."

[OK] Correct: While it swaps less, the main cost is in comparing elements many times, which still takes a lot of time as the list grows.

Interview Connect

Understanding selection sort's time complexity helps you appreciate why more efficient sorting methods are used in real projects, and shows you can analyze how algorithms behave as data grows.

Self-Check

"What if we changed the inner loop to stop early when the list is already sorted? How would the time complexity change?"

Practice

(1/5)
1. What is the main idea behind the Selection Sort Algorithm?
easy
A. Repeatedly find the smallest element and move it to the front
B. Divide the list into halves and sort each half separately
C. Swap adjacent elements if they are in wrong order
D. Insert each element into its correct position in a sorted sublist

Solution

  1. Step 1: Understand selection sort process

    Selection sort finds the smallest element in the unsorted part and swaps it with the first unsorted element.
  2. Step 2: Compare with options

    Repeatedly find the smallest element and move it to the front matches this description exactly, others describe different sorting methods.
  3. Final Answer:

    Repeatedly find the smallest element and move it to the front -> Option A
  4. Quick Check:

    Selection sort = find smallest and swap [OK]
Hint: Selection sort always picks smallest next element [OK]
Common Mistakes:
  • Confusing selection sort with bubble sort
  • Thinking it divides list into halves
  • Mixing it up with insertion sort
2. Which of the following is the correct Rust syntax to swap two elements a[i] and a[min_index] in a vector a?
easy
A. a.swap_elements(i, min_index);
B. swap(a[i], a[min_index]);
C. a[i], a[min_index] = a[min_index], a[i];
D. a.swap(i, min_index);

Solution

  1. Step 1: Recall Rust vector swap method

    Rust vectors have a method called swap that takes two indices and swaps their elements.
  2. Step 2: Match syntax with options

    a.swap(i, min_index); uses a.swap(i, min_index); which is correct. Others are invalid Rust syntax or methods.
  3. Final Answer:

    a.swap(i, min_index); -> Option D
  4. Quick Check:

    Rust vector swap method = a.swap(i, j) [OK]
Hint: Use vector.swap(index1, index2) to swap elements [OK]
Common Mistakes:
  • Trying to swap elements directly with assignment
  • Using non-existent swap_elements method
  • Using Python-style tuple swap syntax
3. What will be the output vector after running selection sort on vec![3, 1, 4, 2]?
medium
A. [1, 3, 2, 4]
B. [4, 3, 2, 1]
C. [1, 2, 3, 4]
D. [2, 1, 3, 4]

Solution

  1. Step 1: Perform selection sort step-by-step

    Initial vector: [3, 1, 4, 2] - Find smallest (1), swap with first element: [1, 3, 4, 2] - Find smallest in remaining (3,4,2) is 2, swap with second element: [1, 2, 4, 3] - Find smallest in last two (4,3) is 3, swap with third element: [1, 2, 3, 4]
  2. Step 2: Confirm final sorted vector

    The vector is sorted ascending: [1, 2, 3, 4]
  3. Final Answer:

    [1, 2, 3, 4] -> Option C
  4. Quick Check:

    Selection sort output = sorted ascending [OK]
Hint: Selection sort outputs sorted ascending list [OK]
Common Mistakes:
  • Confusing selection sort with reverse sorting
  • Stopping after first swap
  • Not swapping correctly
4. Consider this Rust code snippet for selection sort. What is the bug?
fn selection_sort(a: &mut Vec<i32>) {
    let n = a.len();
    for i in 0..=n {
        let mut min_index = i;
        for j in i+1..n {
            if a[j] < a[min_index] {
                min_index = j;
            }
        }
        a.swap(i, min_index);
    }
}
medium
A. min_index should be initialized to 0, not i
B. The outer loop should run until n-1, not n
C. The swap method does not exist for vectors
D. The inner loop should start from 0, not i+1

Solution

  1. Step 1: Analyze loop ranges

    The outer loop runs from 0 to n inclusive, meaning it runs n+1 times. But the last element does not need to be checked because it will already be sorted.
  2. Step 2: Correct loop range for outer loop

    The outer loop should run from 0 to n-1 to avoid unnecessary iteration and potential out-of-bound errors.
  3. Final Answer:

    The outer loop should run until n-1, not n -> Option B
  4. Quick Check:

    Outer loop range = 0..n-1 [OK]
Hint: Outer loop runs to n-1, not n [OK]
Common Mistakes:
  • Running outer loop one step too far
  • Starting inner loop incorrectly
  • Misunderstanding swap method existence
5. You want to sort a vector of integers but only partially: you want the first 3 smallest elements sorted at the front, and the rest can remain unsorted. How can you modify selection sort to do this efficiently?
hard
A. Run the outer loop only 3 times instead of full length
B. Run the inner loop only 3 times for each outer iteration
C. Sort the entire vector then shuffle last elements randomly
D. Use bubble sort for first 3 elements and selection sort for rest

Solution

  1. Step 1: Understand partial sorting requirement

    We only want the first 3 smallest elements sorted at the front, so we only need to find and place the smallest element 3 times.
  2. Step 2: Modify selection sort outer loop

    By running the outer loop 3 times, selection sort will place the 3 smallest elements in order at the front, leaving the rest unsorted.
  3. Final Answer:

    Run the outer loop only 3 times instead of full length -> Option A
  4. Quick Check:

    Partial sort = limit outer loop iterations [OK]
Hint: Limit outer loop to number of elements to sort [OK]
Common Mistakes:
  • Modifying inner loop instead of outer loop
  • Sorting entire vector unnecessarily
  • Mixing sorting algorithms incorrectly
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard