Это наиболее простой и очевидный способ сортировки.
Выбирается минимальный элемент массива, затем он меняется местами с первым элементом.
Теперь массив состоит из двух частей: отсортированной, в которой на данный момент один элемент, и неотсортированной, содержащей все остальные элементы.
Далее описанные шаги повторяются для неотсортированной части массива, в результате чего отсортированная часть массива увеличивается. а неотсортированнаяч — уменьшается.
В итоге приходится несколько раз просматривать неотсортированные элементы в поисках минимального. Асимптотическая сложность данного алгоритма — O(N2).
Приводим алгоритм сортировки выбором на разных языках программирования.
#include <stdio.h>
#include <stdlib.h>
int arr[] = { 12,5,4,9,8,10,0,2,1,3, -1 };
void selection_sort(int ar[], int length)
{
int min, minIndex, i;
min = 0;
minIndex = 0;
for (i = 0; i < length - 1; i++) {
min = ar[i];
minIndex = i;
for (int j = i + 1; j < length; j++) {
if (ar[j] < min) {
min = ar[j];
minIndex = j;
}
}
if (i != minIndex) {
ar[minIndex] = ar[i];
ar[i] = min;
}
}
}
void show(const int ar[], int length)
{
for (int i = 0; i < length; i++)
printf("%d ", ar[i]);
puts("\n========================\n");
}
int main(void)
{
int length = sizeof(arr) / sizeof(*arr);
show(arr, length);
selection_sort(arr, length);
show(arr, length);
return 0;
}
internal class Program
{
static void SelectionSort(T[] arr) where T: IComparable
{
int length=arr.Length;
for(int i=0; i<length-1; i++)
{
int minIndex = i;
for(int j=i+1; j<length; j++)
{
if (arr[j].CompareTo(arr[minIndex])==-1)
{
minIndex = j;
}
}
if (i!=minIndex)
{
T temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
}
static void Main(string[] args)
{
int[] arr = { 12, 5, 4, 9, 8, 10, 0, 2, 1, 3 };
Console.WriteLine($"Array: {string.Join(" ", arr)}");
SelectionSort(arr1);
Console.WriteLine($"Sorted array: {string.Join(" ", arr)}");
Console.ReadKey();
}
}
<?php
function SelectionSort(array &$arr): void
{
$length=count($arr);
$min=0;
$minIndex=0;
for($i=0; $i<$length-1; $i++) {
$min=$arr[$i];
$minIndex=$i;
for($j=$i+1; $j<$length; $j++) {
if ($arr[$j]<$min) {
$min=$arr[$j];
$minIndex=$j;
}
}
if ($i!=$minIndex) {
$arr[$minIndex]=$arr[$i];
$arr[$i]=$min;
}
}
}
function SelectionSort(arr)
{
if (Array.isArray(arr)) {
const len=arr.length;
let min=0,
minIndex=0;
for (let i = 0; i < len - 1; i++) {
min = arr[i];
minIndex = i;
for (let j = i + 1; j < len; j++) {
if (arr[j] < min) {
min = arr[j];
minIndex = j;
}
}
if (i != minIndex) {
arr[minIndex] = arr[i];
arr[i] = min;
}
}
}
else {
throw new Error("Argument must be of type Array");
}
}