Этот вид сортировки заключается в следущем.
Делим массив на две части: слева отсортированная часть, где изначально находится один элемент, и справа — неотсортированная.
Проходим в цикле элементы неотсортированной части и ищем место для очередного элемента путем сравнения его с предыдущим. Если текущий элемент меньше — сдвигаем элементы вправо, и так, пока не найдем место для него или пока не дойдем до нулевого элемента массива.
Как только нашли место и сдвинули элементы, ставим текущий элемент на свое место. Потом шаги повторяются до тех пор, пока не отсортируем весь массив.
Асимптотическая сложность алгоритма — 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("Array: ", arr, length);
selection_sort(arr, length);
show("Sorted array: ", arr, length);
return 0;
}
internal class Program
{
// O(N2)
static void InsertionSort(T[] arr) where T:IComparable
{
int length = arr.Length;
for(int i=1; i<length; i++) {
T temp = arr[i]; int j = i;
while(j > 0 && temp.CompareTo(arr[j-1])==-1)
{
arr[j]=arr[j-1];
j--;
}
arr[j] = temp;
}
}
static void Main(string[] args)
{
int[] arr = { 12, 5, 4, 9, 8, 10, 0, 2, 1, 3 };
Console.WriteLine($"Array: {string.Join(" ", arr)}");
InsertionSort(arr);
Console.WriteLine($"Sorted array: {string.Join(" ", arr)}");
Console.ReadKey();
}
}
<?php
function InsertionSort(array &$arr): void
{
$length=count($arr);
for($i=1; $i<$length; $i++) { $temp=$arr[$i]; $j=$i-1; while($j>=0 && $temp<$arr[$j]) {
$arr[$j+1]=$arr[$j];
$j--;
}
$arr[$j+1]=$temp;
}
}
function InsertionSort(arr)
{
if (Array.isArray(arr)) {
const len=arr.length;
let temp;
for(let i=1; i<len; i++) { temp=arr[i]; let j=i-1; while(j>=0 && temp<arr[j]) {
arr[j+1]=arr[j];
j--;
}
arr[j+1]=temp;
}
}
else {
throw new Error("Argument must be of type Array");
}
}