How it works
Selection Sort scans the unsorted region for the minimum element and swaps it into the next sorted position. It repeats, growing the sorted prefix by one element per pass.
It always performs the same number of comparisons regardless of input order, and at most n-1 swaps total.
Implementation
function selectionSort(arr) { for (let i = 0; i < arr.length - 1; i++) { let minIdx = i; for (let j = i + 1; j < arr.length; j++) { if (arr[j] < arr[minIdx]) minIdx = j; } [arr[i], arr[minIdx]] = [arr[minIdx], arr[i]]; } }
def selection_sort(arr): for i in range(len(arr) - 1): min_idx = i for j in range(i + 1, len(arr)): if arr[j] < arr[min_idx]: min_idx = j arr[i], arr[min_idx] = arr[min_idx], arr[i]
void selectionSort(vector<int>& arr) { for (int i = 0; i < arr.size()-1; i++) { int minIdx = i; for (int j = i + 1; j < arr.size(); j++) { if (arr[j] < arr[minIdx]) minIdx = j; } swap(arr[i], arr[minIdx]); } }
void SelectionSort(int[] arr) { for (int i = 0; i < arr.Length - 1; i++) { int minIdx = i; for (int j = i + 1; j < arr.Length; j++) { if (arr[j] < arr[minIdx]) minIdx = j; } (arr[i], arr[minIdx]) = (arr[minIdx], arr[i]); } }
void selectionSort(int arr[], int n) { for (int i = 0; i < n - 1; i++) { int minIdx = i; for (int j = i + 1; j < n; j++) { if (arr[j] < arr[minIdx]) minIdx = j; } int tmp = arr[i]; arr[i] = arr[minIdx]; arr[minIdx] = tmp; } }
Advantages
- Minimal number of writes (at most n-1 swaps) — useful when writes are expensive.
- Simple and in-place.
Disadvantages
- Always O(n^2) comparisons, even on sorted input — not adaptive.
- Not stable in its classic form.
When to use it
Use it only when the cost of writing/moving elements dominates and the array is small.