- Метод прямого включения
-
Сортировка вставками (англ. insertion sort) — простой алгоритм сортировки. Хотя этот метод сортировки намного менее эффективен, чем более сложные алгоритмы (такие как быстрая сортировка), у него есть ряд преимуществ:
- прост в реализации
- эффективен на небольших наборах данных, на наборах данных до десятков элементов может оказаться лучшим
- эффективен на наборах данных, которые уже частично отсортированы
- это устойчивый алгоритм сортировки (не меняет порядок элементов, которые уже отсортированы)
- может сортировать список по мере его получения
- не требует временной памяти, даже под стек
На каждом шаге алгоритма мы выбираем один из элементов входных данных и вставляем его на нужную позицию в уже отсортированном списке, до тех пор пока набор входных данных не будет исчерпан. Метод выбора очередного элемента из исходного массива произволен; может использоваться практически любой алгоритм выбора.
Содержание
Примеры реализации
isort :: Ord a ⇒ [a] → [a] isort [ ] = [ ] isort (x : xs) = insert x (isort xs)
C
int i, j; for (i = 1; i < size; i++) { temp = array[i]; for (j = i - 1; j >= 0; j--) { if (array[j] < temp) { break; } array[j+1] = array[j]; } array[j+1] = temp; }
C++
#include <algorithm> template< typename Iterator > void insertion_sort( Iterator first, Iterator last ) { for( Iterator i = first + 1; i < last; ++i ) for( Iterator j = i; first < j && *j < *(j - 1); --j ) std::iter_swap( j - 1, j ); }
public static void insertionSort (int[] m, int a, int b) { int t; int i, j; for ( i=a; i < b; i++) { t = m[i]; for ( j=i-1; j>=a && m[j] > t; j--) m[j+1] = m[j]; m[j+1] = t; } }
Метод прямого включения
Python
def fast_insertion_sort(l): for i in xrange(1,len(l)): j=i-1 value=l.pop(i) while (j>=0) and (l[j]>value): j-=1 l.insert(j+1,value) return l
Pascal
const N=255; type array_type=array [1..N] of integer; procedure InsertSort(var x:array_type); var i, j, buf:integer; begin for i:=2 to N do begin buf:=x[i]; j:=i-1; while (j>=1) and (x[j]>buf) do begin x[j+1]:=x[j]; j:=j-1; end; x[j+1]:=buf; end; end;