Сортировка вставками — различия между версиями
Borisov (обсуждение | вклад) (→Анализ алгоритма) |
Borisov (обсуждение | вклад) |
||
Строка 6: | Строка 6: | ||
Алгоритм работает за $O(n + k)$, где k — число обменов элементов входного массива. В среднем и в худшем случае — за $O(n^2)$. Более точные оценки работы алгоритма приведены ниже. | Алгоритм работает за $O(n + k)$, где k — число обменов элементов входного массива. В среднем и в худшем случае — за $O(n^2)$. Более точные оценки работы алгоритма приведены ниже. | ||
</wikitex> | </wikitex> | ||
− | |||
==Псевдокод== | ==Псевдокод== | ||
<wikitex> | <wikitex> | ||
Строка 15: | Строка 14: | ||
j $\leftarrow$ j - 1 | j $\leftarrow$ j - 1 | ||
</wikitex> | </wikitex> | ||
− | |||
== Анализ алгоритма == | == Анализ алгоритма == | ||
<wikitex>Число сравнений ключей на i-ом просеивании ключей ($C_i$) самое большее равно $i-1$, самое меньшее — 1; если предположить, что все перестановки из $n$ ключей равновероятны, то среднее число сравнений $i/2$. Число же обменов элементов $M_i$ равно равно $C_i+2$. Поэтому общее число сравнений и число обменов таковы: | <wikitex>Число сравнений ключей на i-ом просеивании ключей ($C_i$) самое большее равно $i-1$, самое меньшее — 1; если предположить, что все перестановки из $n$ ключей равновероятны, то среднее число сравнений $i/2$. Число же обменов элементов $M_i$ равно равно $C_i+2$. Поэтому общее число сравнений и число обменов таковы: | ||
+ | |||
{| border="0" | {| border="0" | ||
!style="background-color:#FFF"| $C_{best} = n-1$ | !style="background-color:#FFF"| $C_{best} = n-1$ | ||
Строка 32: | Строка 31: | ||
|} | |} | ||
Минимальные оценки встречаются в случае уже упорядоченной исходной последовательности элементов, наихудшие — когда они расположены в обратном порядке.</wikitex> | Минимальные оценки встречаются в случае уже упорядоченной исходной последовательности элементов, наихудшие — когда они расположены в обратном порядке.</wikitex> | ||
− | |||
==Пример работы== | ==Пример работы== | ||
Пример работы алгоритма для массива [5, 2, 4, 3, 1] | Пример работы алгоритма для массива [5, 2, 4, 3, 1] | ||
Строка 90: | Строка 88: | ||
|style="background-color:#FFF;padding:2px 10px"| Меняет второй и первый местами. Массив отсортирован. | |style="background-color:#FFF;padding:2px 10px"| Меняет второй и первый местами. Массив отсортирован. | ||
|} | |} | ||
− | |||
== См. также == | == См. также == | ||
* [[Сортировка пузырьком]] | * [[Сортировка пузырьком]] | ||
Строка 98: | Строка 95: | ||
* [[Быстрая сортировка]] | * [[Быстрая сортировка]] | ||
* [[Сортировка подсчетом]] | * [[Сортировка подсчетом]] | ||
− | |||
− | |||
== Источники == | == Источники == | ||
* [http://ru.wikipedia.org/wiki/Сортировка_вставками Википедия - свободная энциклопедия] | * [http://ru.wikipedia.org/wiki/Сортировка_вставками Википедия - свободная энциклопедия] | ||
* Н. Вирт «Алгоритмы и структуры данных», часть 2.2.1 "Сортировка с помощью прямого включения" | * Н. Вирт «Алгоритмы и структуры данных», часть 2.2.1 "Сортировка с помощью прямого включения" | ||
− | |||
== Дополнительные материалы == | == Дополнительные материалы == | ||
* [http://rain.ifmo.ru/cat/view.php/vis/sorts/quadratic-2010 Визуализатор квадратичных алгоритмов] | * [http://rain.ifmo.ru/cat/view.php/vis/sorts/quadratic-2010 Визуализатор квадратичных алгоритмов] |
Версия 17:22, 20 мая 2012
Сортировка вставками — квадратичный алгоритм сортировки.
Содержание
Алгоритм
<wikitex>На каждом шаге алгоритма мы выбираем один из элементов входных данных и вставляем его на нужную позицию в уже отсортированной части массива, до тех пор пока весь набор входных данных не будет отсортирован. Метод выбора очередного элемента из исходного массива произволен, однако обычно (и с целью получения устойчивого алгоритма сортировки), элементы вставляются по порядку их появления во входном массиве.
Алгоритм работает за $O(n + k)$, где k — число обменов элементов входного массива. В среднем и в худшем случае — за $O(n^2)$. Более точные оценки работы алгоритма приведены ниже. </wikitex>
Псевдокод
<wikitex>
for (int i = 1; i $\leqslant$ n - 1; i++) j $\leftarrow$ i - 1 while (j $\geqslant$ 0 && a[j] > a[j + 1]) a[j] $\leftrightarrow$ a[j + 1] j $\leftarrow$ j - 1
</wikitex>
Анализ алгоритма
<wikitex>Число сравнений ключей на i-ом просеивании ключей ($C_i$) самое большее равно $i-1$, самое меньшее — 1; если предположить, что все перестановки из $n$ ключей равновероятны, то среднее число сравнений $i/2$. Число же обменов элементов $M_i$ равно равно $C_i+2$. Поэтому общее число сравнений и число обменов таковы:
$C_{best} = n-1$ | $M_{best} = 3(n-1)$ | |
---|---|---|
$C_{average} = (n^2+n-2)/4$ | $M_{average} = (n^2+9n-10)/4$ | |
$C_{worst} = (n^2+n-4)/4$ | $M_{worst} = (n^2+3n-4)/2$ |
Минимальные оценки встречаются в случае уже упорядоченной исходной последовательности элементов, наихудшие — когда они расположены в обратном порядке.</wikitex>
Пример работы
Пример работы алгоритма для массива [5, 2, 4, 3, 1]
До | После | Описание шага |
---|---|---|
Первый проход (проталкиваем второй элемент — 2) | ||
5 2 4 3 1 | 2 5 4 3 1 | Алгоритм сравнивает второй элемент с первым и меняет их местами. |
Второй проход (проталкиваем третий элемент — 4) | ||
2 5 4 3 1 | 2 4 5 3 1 | Сравнивает третий со вторым и меняет местами |
2 4 5 3 1 | 2 4 5 3 1 | Второй и первый отсортированы, swap не требуется |
Третий проход (проталкиваем четвертый — 3) | ||
2 4 5 3 1 | 2 4 3 5 1 | Меняет четвертый и третий местами |
2 4 3 5 1 | 2 3 4 5 1 | Меняет третий и второй местами |
2 3 4 5 1 | 2 3 4 5 1 | Второй и первый отсортированы, swap не требуется |
Четвертый проход (проталкиваем пятый элемент — 1) | ||
2 3 4 5 1 | 2 3 4 1 5 | Меняет пятый и четвертый местами |
2 3 4 1 5 | 2 3 1 4 5 | Меняет четвертый и третий местами |
2 3 1 4 5 | 2 1 3 4 5 | Меняет третий и второй местами |
2 1 3 4 5 | 1 2 3 4 5 | Меняет второй и первый местами. Массив отсортирован. |
См. также
- Сортировка пузырьком
- Сортировка выбором
- Сортировка кучей
- Сортировка слиянием
- Быстрая сортировка
- Сортировка подсчетом
Источники
- Википедия - свободная энциклопедия
- Н. Вирт «Алгоритмы и структуры данных», часть 2.2.1 "Сортировка с помощью прямого включения"