# Selection Sort

Selection sort is one of the O(n^{2}) sorting algorithms, which makes it quite inefficient for sorting large data volumes. Selection sort is notable for its programming simplicity and it can over perform other sorts in certain situations (see complexity analysis for more details).

## Algorithm

The idea of algorithm is quite simple. Array is imaginary divided into two parts - sorted one and unsorted one. At the beginning, sorted part is **empty**, while unsorted one contains **whole array**. *At every step,* algorithm finds **minimal element** in the unsorted part and adds it to the end of the sorted one. When unsorted part becomes **empty**, algorithm *stops*.

When algorithm sorts an array, it swaps first element of unsorted part with minimal element and then it is included to the sorted part. This implementation of selection sort in **not stable**. In case of linked list is sorted, and, instead of swaps, minimal element is linked to the unsorted part, selection sort is **stable**.

Let us see an example of sorting an array to make the idea of selection sort clearer.

*Example. *Sort {5, 1, 12, -5, 16, 2, 12, 14} using selection sort.

## Complexity analysis

Selection sort stops, when unsorted part becomes empty. As we know, on every step number of unsorted elements decreased by one. Therefore, selection sort makes n steps (n is number of elements in array) of outer loop, before stop. Every step of outer loop requires finding minimum in unsorted part. Summing up, n + (n - 1) + (n - 2) + ... + 1, results in O(n^{2}) number of comparisons. Number of swaps may vary from zero (in case of sorted array) to n - 1 (in case array was sorted in reversed order), which results in O(n) number of swaps. Overall algorithm complexity is O(n^{2}).

Fact, that selection sort requires n - 1 number of swaps at most, makes it very efficient in situations, when write operation is significantly more expensive, than read operation.

## Code snippets

### Java

**public** **void** selectionSort(**int**[] arr) {

**int** i, j, minIndex, tmp;

**int** n = arr.length;

**for** (i = 0; i < n - 1; i++) {

minIndex = i;

**for** (j = i + 1; j < n; j++)

**if** (arr[j] < arr[minIndex])

minIndex = j;

**if** (minIndex != i) {

tmp = arr[i];

arr[i] = arr[minIndex];

arr[minIndex] = tmp;

}

}

}

### C++

void selectionSort(int arr[], int n) {

int i, j, minIndex, tmp;

for (i = 0; i < n - 1; i++) {

minIndex = i;

for (j = i + 1; j < n; j++)

if (arr[j] < arr[minIndex])

minIndex = j;

if (minIndex != i) {

tmp = arr[i];

arr[i] = arr[minIndex];

arr[minIndex] = tmp;

}

}

}

## Visualizers

- Selection Sort Animation (with source code line by line visualization)
- Selection Sort in Java Applets Centre
- Animated Sorting Algorithms: Selection Sort

## Two responses to "Selection sort tutorial"

- on Oct 20, 2009 said:
very interestin

- on Mar 20, 2009 said:
thank you

## Contribute to AlgoList

Liked this tutorial? Please, consider making a donation. Contribute to help us keep sharing free knowledge and write new tutorials.

Every dollar helps!