Skip to content
Docs
தமிழ்
Esc
↑↓navigate↵open⌘Jpreview
On this page

Selection Sort - The Minimalist Approach

Overview

Selection Sort is an intuitive sorting algorithm that improves upon bubble sort by reducing the number of swaps. While it maintains the same O(n²) time complexity, it performs significantly better for large records due to its minimal data movement. The algorithm selects the smallest element and places it in its correct position.

📚 Table of Contents

Algorithm Concept

🎯 Core Strategy

Selection sort works by repeatedly finding the minimum element from the unsorted portion and placing it at the beginning of the sorted portion.

🔄 Two-Phase Operation

  1. Selection Phase: Find the minimum element in the unsorted portion
  2. Placement Phase: Swap it with the first element of unsorted portion

📊 In-Place Sorting

The algorithm divides the array into two conceptual parts:

  • Sorted portion: Elements at the beginning (initially empty)
  • Unsorted portion: Remaining elements (initially the entire array)

How It Works

Step-by-Step Process

Initial Array: [64, 25, 12, 22, 11]

Pass 1: Find minimum in [64, 25, 12, 22, 11]

[64, 25, 12, 22, 11]
 ↑              ↑
current      minimum(11)

After swap: [11, 25, 12, 22, 64]
            ↑ ← sorted portion grows

Pass 2: Find minimum in [25, 12, 22, 64]

[11, 25, 12, 22, 64]
     ↑   ↑
  current min(12)

After swap: [11, 12, 25, 22, 64]
                ↑ ← sorted portion grows

Pass 3: Find minimum in [25, 22, 64]

[11, 12, 25, 22, 64]
         ↑   ↑
      current min(22)

After swap: [11, 12, 22, 25, 64]
                    ↑ ← sorted portion grows

Pass 4: Find minimum in [25, 64]

[11, 12, 22, 25, 64] ← Already in order, no swap needed
              ↑

Final Result: [11, 12, 22, 25, 64]

Implementation

Complete implementation: Algorithms/Sorting/Simple/Selection Sort/SelectionSort.java

package dsa.algorithms.sorting.simple;

import java.util.Arrays;

public class SelectionSort {
    public static void sort(int[] a) {
        for (int i = 0; i < a.length - 1; i++) {
            int min = i;
            for (int j = i + 1; j < a.length; j++) if (a[j] < a[min]) min = j;
            if (min != i) { int t = a[i]; a[i] = a[min]; a[min] = t; }
        }
    }
    public static void main(String[] args){ int[] a={64,25,12,22,11}; sort(a); System.out.println(Arrays.toString(a)); }
}
public class SelectionSort {
    public static void sort(int[] a) {
        for (int i = 0; i < a.length - 1; i++) {
            int min = i;                           // Assume first element is minimum

            // Find the minimum element in remaining array
            for (int j = i + 1; j < a.length; j++) {
                if (a[j] < a[min]) {
                    min = j;                       // Update minimum index
                }
            }

            // Swap minimum element with first element of unsorted portion
            if (min != i) {
                int temp = a[i];
                a[i] = a[min];
                a[min] = temp;
            }
        }
    }
}

🔍 Algorithm Breakdown

Outer Loop (i)

  • Purpose: Marks the boundary between sorted and unsorted portions
  • Range: 0 to n-2 (last element will be in place automatically)
  • Progress: Sorted portion grows by one element each iteration

Inner Loop (j)

  • Purpose: Finds the minimum element in unsorted portion
  • Range: i+1 to n-1 (elements after current position)
  • Goal: Locate the index of the smallest remaining element

Swap Operation

  • Condition: Only swap if minimum is not already in correct position
  • Effect: Places the minimum element at the start of unsorted portion
  • Optimization: Avoids unnecessary swaps when element is already in place

📈 Execution Trace

For array [64, 25, 12, 22, 11]:

Initial:  [64, 25, 12, 22, 11]  i=0, sorted=[], unsorted=[64,25,12,22,11]
Pass 1:   [11, 25, 12, 22, 64]  i=1, sorted=[11], unsorted=[25,12,22,64]
Pass 2:   [11, 12, 25, 22, 64]  i=2, sorted=[11,12], unsorted=[25,22,64]
Pass 3:   [11, 12, 22, 25, 64]  i=3, sorted=[11,12,22], unsorted=[25,64]
Pass 4:   [11, 12, 22, 25, 64]  i=4, sorted=[11,12,22,25], unsorted=[64]
Final:    [11, 12, 22, 25, 64]  Complete!

Complexity Analysis

⏱️ Time Complexity

Case Complexity Explanation
Best Case O(n²) Even if array is sorted, still need to find minimum
Average Case O(n²) Typical random data performance
Worst Case O(n²) Reverse sorted array

Why always O(n²)?

  • Comparisons: Always need to examine all remaining elements to find minimum
  • Total comparisons: (n-1) + (n-2) + … + 1 = n(n-1)/2 = O(n²)

💾 Space Complexity

  • Auxiliary space: O(1) - only uses a constant amount of extra memory
  • In-place: Yes - sorts within the original array

🔄 Operation Counts

  • Comparisons: Always O(n²) regardless of input
  • Swaps: O(n) in worst case, 0 in best case (already sorted)
  • Assignments: O(n) for index tracking

Advantages & Disadvantages

✅ Advantages

  1. Simple Implementation: Easy to understand and code
  2. Minimal Swaps: At most n-1 swaps (better than bubble sort)
  3. In-Place: No additional memory required
  4. Consistent Performance: No worst-case scenarios for swaps
  5. Good for Large Records: Minimal data movement makes it suitable when moving data is expensive
  6. Not Adaptive but Predictable: Performance doesn’t vary much with input

❌ Disadvantages

  1. Poor Time Complexity: O(n²) makes it inefficient for large datasets
  2. Not Stable: Equal elements may not maintain their relative order
  3. Not Adaptive: Doesn’t benefit from partially sorted data
  4. Unnecessary Comparisons: Always examines all remaining elements
  5. Not Online: Cannot sort data as it arrives

Study Notes for Students

🎯 Key Concepts to Master

1. Two-Pointer Technique

  • Outer pointer (i): Marks the sorted/unsorted boundary
  • Inner pointer (j): Searches for minimum in unsorted portion
  • Minimum tracker: Keeps track of the smallest element found

2. Invariant Understanding

Loop Invariant: After k iterations, the first k elements are in their final sorted positions and are the k smallest elements in the array.

3. Comparison with Bubble Sort

Bubble Sort:              Selection Sort:
- Many swaps per pass     - One swap per pass (maximum)
- Adjacent comparisons    - Global minimum search
- Can terminate early     - Always completes all passes

📖 Visual Learning

Array State Progression

Pass:  0    1    2    3    4
      [64] [25] [12] [22] [11]  ← Original
      [11] [25] [12] [22] [64]  ← After pass 1
      [11] [12] [25] [22] [64]  ← After pass 2
      [11] [12] [22] [25] [64]  ← After pass 3
      [11] [12] [22] [25] [64]  ← After pass 4 (no change)
       ↑    ↑    ↑    ↑    ↑
    Sorted portion grows →

⚠️ Common Mistakes

1. Off-by-One Errors

// WRONG: Includes last element unnecessarily
for (int i = 0; i < a.length; i++) {

// CORRECT: Last element will be in place automatically
for (int i = 0; i < a.length - 1; i++) {

2. Forgetting to Update Minimum Index

// WRONG: Updates value instead of index
if (a[j] < a[min]) min = a[j];

// CORRECT: Updates the index
if (a[j] < a[min]) min = j;

3. Unnecessary Swaps

// WRONG: Always swaps
int temp = a[i]; a[i] = a[min]; a[min] = temp;

// CORRECT: Only swap if needed
if (min != i) {
    int temp = a[i]; a[i] = a[min]; a[min] = temp;
}

🧠 Problem-Solving Applications

When to Use Selection Sort

  • ✅ Small datasets (< 50 elements)
  • ✅ Memory constraints (needs O(1) space)
  • ✅ Minimizing swaps is important
  • ✅ Simple implementation required
  • ✅ Educational purposes to understand sorting

When to Use Alternatives

  • ❌ Large datasets → Use O(n log n) algorithms
  • ❌ Stability required → Use stable algorithms
  • ❌ Partially sorted data → Use adaptive algorithms
  • ❌ Online sorting → Use insertion sort

Comparison with Other O(n²) Algorithms

Algorithm Comparisons Swaps Stable Adaptive Space
Selection Sort O(n²) O(n) ❌ ❌ O(1)
Bubble Sort O(n²) O(n²) ✅ ✅ O(1)
Insertion Sort O(n²) O(n²) ✅ ✅ O(1)

Practice Problems

🟢 Beginner Level

  1. Implement selection sort for strings
  2. Find kth smallest element using selection sort idea
  3. Count swaps performed during selection sort
  4. Sort in descending order using selection sort
  5. Selection sort for linked lists

🟡 Intermediate Level

  1. Bidirectional selection sort: Find both min and max each pass
  2. Stable selection sort: Modify to maintain stability
  3. Selection sort with early termination: Stop when sorted
  4. Cocktail selection sort: Alternate between min and max
  5. Memory-optimized version: Minimize memory accesses

🔴 Advanced Level

  1. External selection sort: For data larger than memory
  2. Parallel selection sort: Multi-threaded implementation
  3. Adaptive selection sort: Optimize for partially sorted data
  4. Selection sort analysis: Prove time complexity bounds
  5. Hybrid algorithms: Combine with other sorting methods

Real-World Applications

🎯 Practical Use Cases

  • Embedded Systems: Where memory is extremely limited
  • Small Data Sorting: When dataset size is guaranteed to be small
  • Teaching Tool: Demonstrating sorting concepts
  • Quick Prototyping: When simple implementation is needed
  • Benchmark Baseline: Comparing against other algorithms
  • Bubble Sort - Another simple O(n²) algorithm
  • Insertion Sort - More efficient O(n²) alternative
  • Heap Sort - Uses selection principle efficiently
  • Quick Select - Finding kth element
  • Sorting Analysis - Algorithm comparison

Last updated on 7 அக்டோபர், 2026

Was this page helpful?