diff --git a/sort/selection_sort.go b/sort/selection_sort.go new file mode 100644 index 0000000..574cd96 --- /dev/null +++ b/sort/selection_sort.go @@ -0,0 +1,27 @@ +package sort + +// SelectionSort is an impelementaion of selection sort algorithm. +// Wikipedia: https://en.wikipedia.org/wiki/Selection_sort +// +// The algorithm divides the input list into two parts: the sublist of items +// already sorted, which is built up from left to right at the front (left) of +// the list, and the sublist of items remaining to be sorted that occupy the +// rest of the list. Initially, the sorted sublist is empty and the unsorted +// sublist is the entire input list. The algorithm proceeds by finding the +// smallest (or largest, depending on sorting order) element in the unsorted +// sublist, exchanging (swapping) it with the leftmost unsorted element (putting +// it in sorted order), and moving the sublist boundaries one element to the +// right. +func SelectionSort(a []int) []int { + for i := 0; i < len(a); i++ { + min := i + for j := i + 1; j < len(a); j++ { + if a[j] < a[min] { + min = j + } + } + a[i], a[min] = a[min], a[i] + } + + return a +} diff --git a/sort/selection_sort_test.go b/sort/selection_sort_test.go new file mode 100644 index 0000000..c9ee271 --- /dev/null +++ b/sort/selection_sort_test.go @@ -0,0 +1,18 @@ +package sort + +import ( + "testing" +) + +func TestSelectionSort(t *testing.T) { + testSort(t, SelectionSort, + []int{5, 3, 1, 4, 2}, + []int{1, 2, 3, 4, 5}, + ) +} + +func BenchmarkSelectionSort(b *testing.B) { + for i := 0; i < b.N; i++ { + SelectionSort(unsortedArray()) + } +}