<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Krotser</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Krotser"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Krotser"/>
		<updated>2026-06-11T20:00:07Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=24321</id>
		<title>Сортировка выбором</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=24321"/>
				<updated>2012-06-07T12:22:35Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: /* Реализация */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Сортировка выбором''' (англ. '''selection sort''') {{---}} простой алгоритм сортировки со сложностью &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} количество элементов для сортировки.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
На каждом &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ом шаге алгоритма находим &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ый минимальный элемент и меняем его местами с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ым элементом в массиве. Таким образом будет получен массив отсортированный по неубыванию.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
Вариант 1.&lt;br /&gt;
  SelectionSort(a)&lt;br /&gt;
    for i = 0 to n - 2&lt;br /&gt;
      min = i;&lt;br /&gt;
      for j = i + 1 to n - 1&lt;br /&gt;
        if a[j] &amp;lt; a[min]&lt;br /&gt;
          min = j;&lt;br /&gt;
      swap(a[i], a[min]);&lt;br /&gt;
&lt;br /&gt;
Вариант 2.&lt;br /&gt;
  SelectionSort(a)&lt;br /&gt;
    for i = 0 to n - 2&lt;br /&gt;
      for j = i + 1 to n - 1&lt;br /&gt;
        if a[i] &amp;gt; a[j]&lt;br /&gt;
          swap(a[i], a[j]);&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана последовательность из &amp;lt;tex&amp;gt;5&amp;lt;/tex&amp;gt; элементов &amp;lt;tex&amp;gt;5, 4, 1, 2, 3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;background-color:#CCC;margin:0.5px&amp;quot;&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| Массив&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| Описание шага&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Первый проход (текущий массив начинается с первого элемента)''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 5 4 '''1''' 2 3&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Находим первый минимальный элемент {{---}} '''1''' &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| '''1''' 4 '''5''' 2 3&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем минимальный и первый элементы местами&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Второй проход (текущий массив начинается со следующего элемента)''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 5 4 '''2''' 3&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Находим следующий минимальный элемент {{---}} '''2''' &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 '''2''' 4 '''5''' 3&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем минимальный и второй элементы местами&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Третий проход (текущий массив начинается со следующего элемента)''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 4 5 '''3'''&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Находим следующий минимальный элемент {{---}} '''3''' &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 '''3''' 5 '''4'''&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем минимальный и третий элементы местами&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Четвертый проход (текущий массив начинается со следующего элемента)''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 3 5 '''4'''&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Находим следующий минимальный элемент {{---}} '''4''' &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 3 '''4''' '''5'''&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем минимальный и четвертый элементы местами&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 3 4 5&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Массив отсортирован&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ссылки == &lt;br /&gt;
*[http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC Сортировка выбором в русской википедии]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом &amp;quot;Вильямс&amp;quot;, 2005. ISBN 5-8459-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Сортировки]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=24319</id>
		<title>Сортировка выбором</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=24319"/>
				<updated>2012-06-07T12:22:18Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: /* Реализация */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Сортировка выбором''' (англ. '''selection sort''') {{---}} простой алгоритм сортировки со сложностью &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} количество элементов для сортировки.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
На каждом &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ом шаге алгоритма находим &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ый минимальный элемент и меняем его местами с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ым элементом в массиве. Таким образом будет получен массив отсортированный по неубыванию.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
Вариант 1.&lt;br /&gt;
  SelectionSort(a)&lt;br /&gt;
    for i = 0 to n - 2&lt;br /&gt;
      min = i;&lt;br /&gt;
      for j = i + 1 to n - 1&lt;br /&gt;
        if a[j] &amp;lt; a[min]&lt;br /&gt;
          min = j;&lt;br /&gt;
      swap(a[i], a[min]);&lt;br /&gt;
  // Массив x отсортирован&lt;br /&gt;
&lt;br /&gt;
Вариант 2.&lt;br /&gt;
  SelectionSort(a)&lt;br /&gt;
    for i = 0 to n - 2&lt;br /&gt;
      for j = i + 1 to n - 1&lt;br /&gt;
        if a[i] &amp;gt; a[j]&lt;br /&gt;
          swap(a[i], a[j]);&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана последовательность из &amp;lt;tex&amp;gt;5&amp;lt;/tex&amp;gt; элементов &amp;lt;tex&amp;gt;5, 4, 1, 2, 3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;background-color:#CCC;margin:0.5px&amp;quot;&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| Массив&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| Описание шага&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Первый проход (текущий массив начинается с первого элемента)''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 5 4 '''1''' 2 3&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Находим первый минимальный элемент {{---}} '''1''' &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| '''1''' 4 '''5''' 2 3&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем минимальный и первый элементы местами&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Второй проход (текущий массив начинается со следующего элемента)''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 5 4 '''2''' 3&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Находим следующий минимальный элемент {{---}} '''2''' &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 '''2''' 4 '''5''' 3&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем минимальный и второй элементы местами&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Третий проход (текущий массив начинается со следующего элемента)''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 4 5 '''3'''&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Находим следующий минимальный элемент {{---}} '''3''' &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 '''3''' 5 '''4'''&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем минимальный и третий элементы местами&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Четвертый проход (текущий массив начинается со следующего элемента)''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 3 5 '''4'''&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Находим следующий минимальный элемент {{---}} '''4''' &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 3 '''4''' '''5'''&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем минимальный и четвертый элементы местами&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 3 4 5&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Массив отсортирован&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ссылки == &lt;br /&gt;
*[http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC Сортировка выбором в русской википедии]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом &amp;quot;Вильямс&amp;quot;, 2005. ISBN 5-8459-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Сортировки]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=24318</id>
		<title>Сортировка выбором</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=24318"/>
				<updated>2012-06-07T12:16:51Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: /* Реализация */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Сортировка выбором''' (англ. '''selection sort''') {{---}} простой алгоритм сортировки со сложностью &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} количество элементов для сортировки.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
На каждом &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ом шаге алгоритма находим &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ый минимальный элемент и меняем его местами с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ым элементом в массиве. Таким образом будет получен массив отсортированный по неубыванию.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
Вариант 1.&lt;br /&gt;
  // Входной массив a, содержащий n элементов.&lt;br /&gt;
  for i = 0 to n - 2&lt;br /&gt;
    min = i;&lt;br /&gt;
    for j = i + 1 to n - 1&lt;br /&gt;
      if a[j] &amp;lt; a[min]&lt;br /&gt;
        min = j;&lt;br /&gt;
    swap(a[i], a[min]);&lt;br /&gt;
  // Массив x отсортирован&lt;br /&gt;
&lt;br /&gt;
Вариант 2.&lt;br /&gt;
  for i = 0 to n - 2&lt;br /&gt;
    for j = i + 1 to n - 1&lt;br /&gt;
      if a[i] &amp;gt; a[j]&lt;br /&gt;
        swap(a[i], a[j]);&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана последовательность из &amp;lt;tex&amp;gt;5&amp;lt;/tex&amp;gt; элементов &amp;lt;tex&amp;gt;5, 4, 1, 2, 3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;background-color:#CCC;margin:0.5px&amp;quot;&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| Массив&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| Описание шага&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Первый проход (текущий массив начинается с первого элемента)''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 5 4 '''1''' 2 3&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Находим первый минимальный элемент {{---}} '''1''' &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| '''1''' 4 '''5''' 2 3&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем минимальный и первый элементы местами&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Второй проход (текущий массив начинается со следующего элемента)''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 5 4 '''2''' 3&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Находим следующий минимальный элемент {{---}} '''2''' &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 '''2''' 4 '''5''' 3&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем минимальный и второй элементы местами&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Третий проход (текущий массив начинается со следующего элемента)''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 4 5 '''3'''&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Находим следующий минимальный элемент {{---}} '''3''' &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 '''3''' 5 '''4'''&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем минимальный и третий элементы местами&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Четвертый проход (текущий массив начинается со следующего элемента)''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 3 5 '''4'''&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Находим следующий минимальный элемент {{---}} '''4''' &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 3 '''4''' '''5'''&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем минимальный и четвертый элементы местами&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 3 4 5&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Массив отсортирован&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ссылки == &lt;br /&gt;
*[http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC Сортировка выбором в русской википедии]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом &amp;quot;Вильямс&amp;quot;, 2005. ISBN 5-8459-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Сортировки]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=24317</id>
		<title>Сортировка выбором</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=24317"/>
				<updated>2012-06-07T12:13:50Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: /* Реализация */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Сортировка выбором''' (англ. '''selection sort''') {{---}} простой алгоритм сортировки со сложностью &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} количество элементов для сортировки.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
На каждом &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ом шаге алгоритма находим &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ый минимальный элемент и меняем его местами с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ым элементом в массиве. Таким образом будет получен массив отсортированный по неубыванию.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
Вариант 1.&lt;br /&gt;
  // Входной массив x, содержащий n элементов.&lt;br /&gt;
  for i = 0 to n - 2&lt;br /&gt;
     min = i;&lt;br /&gt;
     for j = i + 1 to n - 1&lt;br /&gt;
        if x[j] &amp;lt; x[min]&lt;br /&gt;
           min = j;&lt;br /&gt;
     swap(x[i], x[min]);&lt;br /&gt;
  // Массив x отсортирован&lt;br /&gt;
&lt;br /&gt;
Вариант 2.&lt;br /&gt;
  for i = 0 to n - 2&lt;br /&gt;
     for j = i + 1 to n - 1&lt;br /&gt;
        if x[i] &amp;gt; x[j]&lt;br /&gt;
              swap(x[i], x[j]);&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана последовательность из &amp;lt;tex&amp;gt;5&amp;lt;/tex&amp;gt; элементов &amp;lt;tex&amp;gt;5, 4, 1, 2, 3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;background-color:#CCC;margin:0.5px&amp;quot;&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| Массив&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| Описание шага&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Первый проход (текущий массив начинается с первого элемента)''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 5 4 '''1''' 2 3&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Находим первый минимальный элемент {{---}} '''1''' &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| '''1''' 4 '''5''' 2 3&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем минимальный и первый элементы местами&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Второй проход (текущий массив начинается со следующего элемента)''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 5 4 '''2''' 3&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Находим следующий минимальный элемент {{---}} '''2''' &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 '''2''' 4 '''5''' 3&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем минимальный и второй элементы местами&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Третий проход (текущий массив начинается со следующего элемента)''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 4 5 '''3'''&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Находим следующий минимальный элемент {{---}} '''3''' &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 '''3''' 5 '''4'''&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем минимальный и третий элементы местами&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Четвертый проход (текущий массив начинается со следующего элемента)''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 3 5 '''4'''&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Находим следующий минимальный элемент {{---}} '''4''' &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 3 '''4''' '''5'''&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем минимальный и четвертый элементы местами&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 3 4 5&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Массив отсортирован&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ссылки == &lt;br /&gt;
*[http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC Сортировка выбором в русской википедии]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом &amp;quot;Вильямс&amp;quot;, 2005. ISBN 5-8459-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Сортировки]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=24287</id>
		<title>Сортировка выбором</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=24287"/>
				<updated>2012-06-07T07:52:55Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Сортировка выбором''' (англ. '''selection sort''') {{---}} простой алгоритм сортировки со сложностью &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} количество элементов для сортировки.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
На каждом &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ом шаге алгоритма находим &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ый минимальный элемент и меняем его местами с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ым элементом в массиве. Таким образом будет получен массив отсортированный по неубыванию.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
Вариант 1.&lt;br /&gt;
  // Входной массив x, содержащий n элементов.&lt;br /&gt;
  for i = 0 to n - 2&lt;br /&gt;
     min = i;&lt;br /&gt;
        for j = i + 1 to n - 1&lt;br /&gt;
           if x[j] &amp;lt; x[min]&lt;br /&gt;
              min = j;&lt;br /&gt;
     swap(x[i], x[min]);&lt;br /&gt;
  // Массив x отсортирован&lt;br /&gt;
&lt;br /&gt;
Вариант 2.&lt;br /&gt;
  for i = 0 to n - 2&lt;br /&gt;
     for j = i + 1 to n - 1&lt;br /&gt;
        if x[i] &amp;gt; x[j]&lt;br /&gt;
              swap(x[i], x[j]);&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана последовательность из &amp;lt;tex&amp;gt;5&amp;lt;/tex&amp;gt; элементов &amp;lt;tex&amp;gt;5, 4, 1, 2, 3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;background-color:#CCC;margin:0.5px&amp;quot;&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| Массив&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| Описание шага&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Первый проход (текущий массив начинается с первого элемента)''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 5 4 '''1''' 2 3&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Находим первый минимальный элемент {{---}} '''1''' &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| '''1''' 4 '''5''' 2 3&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем минимальный и первый элементы местами&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Второй проход (текущий массив начинается со следующего элемента)''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 5 4 '''2''' 3&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Находим следующий минимальный элемент {{---}} '''2''' &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 '''2''' 4 '''5''' 3&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем минимальный и второй элементы местами&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Третий проход (текущий массив начинается со следующего элемента)''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 4 5 '''3'''&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Находим следующий минимальный элемент {{---}} '''3''' &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 '''3''' 5 '''4'''&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем минимальный и третий элементы местами&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Четвертый проход (текущий массив начинается со следующего элемента)''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 3 5 '''4'''&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Находим следующий минимальный элемент {{---}} '''4''' &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 3 '''4''' '''5'''&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем минимальный и четвертый элементы местами&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 3 4 5&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Массив отсортирован&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ссылки == &lt;br /&gt;
*[http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC Сортировка выбором в русской википедии]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом &amp;quot;Вильямс&amp;quot;, 2005. ISBN 5-8459-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Сортировки]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22631</id>
		<title>Сортировка выбором</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22631"/>
				<updated>2012-05-22T07:44:08Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: /* Алгоритм */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Сортировка выбором''' (англ. '''selection sort''') {{---}} простой алгоритм сортировки со сложностью &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} количество элементов для сортировки.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
На каждом &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ом шаге алгоритма находим &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ый минимальный элемент и меняем его местами с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ым элементом в массиве. Таким образом будет получен массив отсортированный по неубыванию.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  // Входной массив x, содержащий n элементов.&lt;br /&gt;
  for i = 0 to n - 1&lt;br /&gt;
     min = i;&lt;br /&gt;
        for j = i + 1 to n - 1&lt;br /&gt;
           if x[j] &amp;lt; x[min]&lt;br /&gt;
              min = j;&lt;br /&gt;
     swap(x[i], x[min]);&lt;br /&gt;
  // Массив x отсортирован&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана последовательность из &amp;lt;tex&amp;gt;5&amp;lt;/tex&amp;gt; элементов &amp;lt;tex&amp;gt;5, 4, 1, 2, 3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;background-color:#CCC;margin:0.5px&amp;quot;&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| Массив&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| Описание шага&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Первый проход (текущий массив начинается с первого элемента)''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 5 4 '''1''' 2 3&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Находим первый минимальный элемент {{---}} '''1''' &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| '''1''' 4 '''5''' 2 3&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем минимальный и первый элементы местами&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Второй проход (текущий массив начинается со следующего элемента)''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 5 4 '''2''' 3&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Находим следующий минимальный элемент {{---}} '''2''' &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 '''2''' 4 '''5''' 3&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем минимальный и второй элементы местами&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Третий проход (текущий массив начинается со следующего элемента)''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 4 5 '''3'''&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Находим следующий минимальный элемент {{---}} '''3''' &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 '''3''' 5 '''4'''&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем минимальный и третий элементы местами&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Четвертый проход (текущий массив начинается со следующего элемента)''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 3 5 '''4'''&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Находим следующий минимальный элемент {{---}} '''4''' &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 3 '''4''' '''5'''&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем минимальный и четвертый элементы местами&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 3 4 5&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Массив отсортирован&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ссылки == &lt;br /&gt;
*[http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC Сортировка выбором в русской википедии]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом &amp;quot;Вильямс&amp;quot;, 2005. ISBN 5-8459-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Сортировки]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22630</id>
		<title>Сортировка выбором</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22630"/>
				<updated>2012-05-22T07:41:33Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Сортировка выбором''' (англ. '''selection sort''') {{---}} простой алгоритм сортировки со сложностью &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} количество элементов для сортировки.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
На каждом &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ом шаге алгоритма находим &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ый минимальный элемент и меняем его местами с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ым элементом в массиве. Таким образом, будет получен массив отсортированный по неубыванию.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  // Входной массив x, содержащий n элементов.&lt;br /&gt;
  for i = 0 to n - 1&lt;br /&gt;
     min = i;&lt;br /&gt;
        for j = i + 1 to n - 1&lt;br /&gt;
           if x[j] &amp;lt; x[min]&lt;br /&gt;
              min = j;&lt;br /&gt;
     swap(x[i], x[min]);&lt;br /&gt;
  // Массив x отсортирован&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана последовательность из &amp;lt;tex&amp;gt;5&amp;lt;/tex&amp;gt; элементов &amp;lt;tex&amp;gt;5, 4, 1, 2, 3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;background-color:#CCC;margin:0.5px&amp;quot;&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| Массив&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| Описание шага&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Первый проход (текущий массив начинается с первого элемента)''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 5 4 '''1''' 2 3&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Находим первый минимальный элемент {{---}} '''1''' &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| '''1''' 4 '''5''' 2 3&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем минимальный и первый элементы местами&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Второй проход (текущий массив начинается со следующего элемента)''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 5 4 '''2''' 3&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Находим следующий минимальный элемент {{---}} '''2''' &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 '''2''' 4 '''5''' 3&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем минимальный и второй элементы местами&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Третий проход (текущий массив начинается со следующего элемента)''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 4 5 '''3'''&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Находим следующий минимальный элемент {{---}} '''3''' &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 '''3''' 5 '''4'''&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем минимальный и третий элементы местами&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Четвертый проход (текущий массив начинается со следующего элемента)''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 3 5 '''4'''&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Находим следующий минимальный элемент {{---}} '''4''' &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 3 '''4''' '''5'''&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем минимальный и четвертый элементы местами&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 3 4 5&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Массив отсортирован&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ссылки == &lt;br /&gt;
*[http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC Сортировка выбором в русской википедии]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом &amp;quot;Вильямс&amp;quot;, 2005. ISBN 5-8459-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Сортировки]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22629</id>
		<title>Сортировка выбором</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22629"/>
				<updated>2012-05-22T07:40:59Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Сортировка выбором''' (англ. '''selection sort''') {{---}} простой алгоритм сортировки со сложностью &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} количество элементов для сортировки.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
На каждом &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ом шаге алгоритма находим &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ый минимальный элемент и меняем его местами с &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ым элементом в массиве. Таким образом, будет получен массив отсортированный по неубыванию.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  // Входной массив x, содержащий n элементов.&lt;br /&gt;
  for i = 0 to n - 1&lt;br /&gt;
     min = i;&lt;br /&gt;
        for j = i + 1 to n - 1&lt;br /&gt;
           if x[j] &amp;lt; x[min]&lt;br /&gt;
              min = j;&lt;br /&gt;
     swap(x[i], x[min]);&lt;br /&gt;
  // Массив x отсортирован&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана последовательность из &amp;lt;tex&amp;gt;5&amp;lt;/tex&amp;gt; элементов &amp;lt;tex&amp;gt;5, 4, 1, 2, 3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;background-color:#CCC;margin:0.5px&amp;quot;&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| Массив&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| Описание шага&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Первый проход (текущий массив начинается с первого элемента)''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 5 4 '''1''' 2 3&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Находим первый минимальный элемент {{---}} '''1''' &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| '''1''' 4 '''5''' 2 3&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем минимальный и первый элемент&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Второй проход (текущий массив начинается со следующего элемента)''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 5 4 '''2''' 3&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Находим следующий минимальный элемент {{---}} '''2''' &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 '''2''' 4 '''5''' 3&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем минимальный и второй элемент&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Третий проход (текущий массив начинается со следующего элемента)''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 4 5 '''3'''&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Находим следующий минимальный элемент {{---}} '''3''' &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 '''3''' 5 '''4'''&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем минимальный и третий элемент&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Четвертый проход (текущий массив начинается со следующего элемента)''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 3 5 '''4'''&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Находим следующий минимальный элемент {{---}} '''4''' &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 3 '''4''' '''5'''&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем минимальный и четвертый элемент&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 3 4 5&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Массив отсортирован&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ссылки == &lt;br /&gt;
*[http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC Сортировка выбором в русской википедии]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом &amp;quot;Вильямс&amp;quot;, 2005. ISBN 5-8459-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Сортировки]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22593</id>
		<title>Сортировка выбором</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22593"/>
				<updated>2012-05-20T20:14:05Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Сортировка выбором''' (англ. '''selection sort''') {{---}} простой алгоритм сортировки со сложностью &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} количество элементов для сортировки.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
1. Находим номер минимального элемента из текущего массива.&lt;br /&gt;
&lt;br /&gt;
2. Меняем минимальный элемент с первым элементом массива.&lt;br /&gt;
&lt;br /&gt;
3. Если текущий массив пуст, то данный массив отсортирован. Иначе вернемся к шагу 1, убрав первый элемент из  текущего массива.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  // Входной массив x, содержащий n элементов.&lt;br /&gt;
  for i = 0 to n - 1&lt;br /&gt;
     min = i;&lt;br /&gt;
        for j = i + 1 to n - 1&lt;br /&gt;
           if x[j] &amp;lt; x[min]&lt;br /&gt;
              min = j;&lt;br /&gt;
     swap(x[i], x[min]);&lt;br /&gt;
  // Массив x отсортирован&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана последовательность из &amp;lt;tex&amp;gt;5&amp;lt;/tex&amp;gt; элементов &amp;lt;tex&amp;gt;5, 4, 1, 2, 3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;background-color:#CCC;margin:0.5px&amp;quot;&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| Массив&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| Описание шага&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Первый проход (текущий массив начинается с первого элемента)''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 5 4 '''1''' 2 3&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Находим минимальный элемент {{---}} '''1''' &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| '''1''' 4 '''5''' 2 3&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем минимальный и первый элемент текущего массива&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Второй проход (текущий массив начинается со следующего элемента)''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 5 4 '''2''' 3&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Находим минимальный элемент {{---}} '''2''' &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 '''2''' 4 '''5''' 3&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем минимальный и первый элемент текущего массива&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Третий проход (текущий массив начинается со следующего элемента)''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 4 5 '''3'''&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Находим минимальный элемент {{---}} '''3''' &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 '''3''' 5 '''4'''&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем минимальный и первый элемент текущего массива&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Четвертый проход (текущий массив начинается со следующего элемента)''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 3 5 '''4'''&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Находим минимальный элемент {{---}} '''4''' &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 3 '''4''' '''5'''&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняем минимальный и первый элемент текущего массива&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 1 2 3 4 5&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Массив отсортирован&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ссылки == &lt;br /&gt;
*[http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC Сортировка выбором в русской википедии]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом &amp;quot;Вильямс&amp;quot;, 2005. ISBN 5-8459-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Сортировки]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22588</id>
		<title>Сортировка выбором</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22588"/>
				<updated>2012-05-20T19:48:11Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Сортировка выбором''' (англ. '''selection sort''') {{---}} простой алгоритм сортировки со сложностью &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} количество элементов для сортировки.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
1. Находим номер минимального элемента из текущего массива.&lt;br /&gt;
&lt;br /&gt;
2. Меняем минимальный элемент с первым элементом массива.&lt;br /&gt;
&lt;br /&gt;
3. Если текущий массив пуст, то данный массив отсортирован. Иначе вернемся к шагу 1, убрав первый элемент из  текущего массива.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  // Входной массив x, содержащий n элементов.&lt;br /&gt;
  for i = 0 to n - 1&lt;br /&gt;
     min = i;&lt;br /&gt;
        for j = i + 1 to n - 1&lt;br /&gt;
           if x[j] &amp;lt; x[min]&lt;br /&gt;
              min = j;&lt;br /&gt;
     swap(x[i], x[min]);&lt;br /&gt;
  // Массив x отсортирован&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана последовательность из &amp;lt;tex&amp;gt;6&amp;lt;/tex&amp;gt; элементов &amp;lt;tex&amp;gt;5, 4, 1, 6, 2, 3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;background-color:#CCC;margin:0.5px&amp;quot;&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| До&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| После&lt;br /&gt;
!style=&amp;quot;background-color:#EEE&amp;quot;| Описание шага&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Первый проход (проталкиваем второй элемент — '''''2''''')''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| '''5 2''' 4 3 1&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| '''2 5''' 4 3 1&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Алгоритм сравнивает второй элемент с первым и меняет их местами.&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Второй проход (проталкиваем третий элемент — '''''4''''')''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 2 '''5 4''' 3 1 &lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 2 '''4 5''' 3 1&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Сравнивает третий со вторым и меняет местами&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| '''2 4''' 5 3 1&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| '''2 4''' 5 3 1&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Второй и первый отсортированы, swap не требуется&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Третий проход (проталкиваем четвертый — '''''3''''')''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 2 4 '''5 3''' 1&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 2 4 '''3 5''' 1&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняет четвертый и третий местами&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 2 '''4 3''' 5 1&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 2 '''3 4''' 5 1&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняет третий и второй местами&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| '''2 3''' 4 5 1&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| '''2 3''' 4 5 1&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Второй и первый отсортированы, swap не требуется&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|colspan=3|''Четвертый проход (проталкиваем пятый элемент — '''''1''''')''&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 2 3 4 '''5 1'''&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 2 3 4 '''1 5'''&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняет пятый и четвертый местами&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 2 3 '''4 1''' 5&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 2 3 '''1 4''' 5&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняет четвертый и третий местами&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 2 '''3 1''' 4 5&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| 2 '''1 3''' 4 5 &lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняет третий и второй местами&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| '''2 1''' 3 4 5&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| '''1 2''' 3 4 5&lt;br /&gt;
|style=&amp;quot;background-color:#FFF;padding:2px 10px&amp;quot;| Меняет второй и первый местами. Массив отсортирован.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ссылки == &lt;br /&gt;
*[http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC Сортировка выбором в русской википедии]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом &amp;quot;Вильямс&amp;quot;, 2005. ISBN 5-8459-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Сортировки]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22585</id>
		<title>Сортировка выбором</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22585"/>
				<updated>2012-05-20T19:21:14Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Сортировка выбором''' (англ. '''selection sort''') {{---}} простой алгоритм сортировки со сложностью &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} количество элементов для сортировки.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
[[file:Selection_sort.png|thumb|240px|Пример работы алгоритма для последовательности из 6 элементов]]&lt;br /&gt;
&lt;br /&gt;
1. Находим номер минимального элемента из текущего массива.&lt;br /&gt;
&lt;br /&gt;
2. Меняем минимальный элемент с первым элементом массива.&lt;br /&gt;
&lt;br /&gt;
3. Если текущий массив пуст, то данный массив отсортирован. Иначе вернемся к шагу 1, убрав первый элемент из  текущего массива.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Пример'''&lt;br /&gt;
&lt;br /&gt;
Пусть дана последовательность из &amp;lt;tex&amp;gt;6&amp;lt;/tex&amp;gt; элементов &amp;lt;tex&amp;gt;5, 4, 1, 6, 2, 3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Белым фоном обозначен текущий список, зеленым отсортированная часть, а красным минимальный элемент.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  // Входной массив x, содержащий n элементов.&lt;br /&gt;
  for i = 0 to n - 1&lt;br /&gt;
     min = i;&lt;br /&gt;
        for j = i + 1 to n - 1&lt;br /&gt;
           if x[j] &amp;lt; x[min]&lt;br /&gt;
              min = j;&lt;br /&gt;
     swap(x[i], x[min]);&lt;br /&gt;
  // Массив x отсортирован&lt;br /&gt;
&lt;br /&gt;
== Ссылки == &lt;br /&gt;
*[http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC Сортировка выбором в русской википедии]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом &amp;quot;Вильямс&amp;quot;, 2005. ISBN 5-8459-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Сортировки]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22565</id>
		<title>Сортировка выбором</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22565"/>
				<updated>2012-05-20T12:16:43Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: /* Алгоритм */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Сортировка выбором''' (англ. '''selection sort''') - это простой алгоритм сортировки со сложностью &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; - количество элементов для сортировки. Сортировка выбором предназначена для решения задачи сортировки (sorting problem).&lt;br /&gt;
&lt;br /&gt;
== Задача сортировки ==&lt;br /&gt;
'''На входе''' последовательность из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; чисел. &lt;br /&gt;
&lt;br /&gt;
'''На выходе''' отсортированная последовательность по неубыванию.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
[[file:Selection_sort.png|thumb|240px|Пример работы алгоритма для последовательности из 6 элементов]]&lt;br /&gt;
0. Назовем элементы массива списком.&lt;br /&gt;
&lt;br /&gt;
1. Находим номер минимального элемента из текущего списка.&lt;br /&gt;
&lt;br /&gt;
2. Меняем минимальный элемент с первым элементом списка.&lt;br /&gt;
&lt;br /&gt;
3. Если список пуст, то массив отсортирован. Иначе вернемся к шагу 1, убрав первый элемент из списка.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Пример'''&lt;br /&gt;
&lt;br /&gt;
Пусть дана последовательность из &amp;lt;tex&amp;gt;6&amp;lt;/tex&amp;gt; элементов &amp;lt;tex&amp;gt;5, 4, 1, 6, 2, 3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Белым фоном обозначен текущий список, зеленым отсортированная часть, а красным минимальный элемент.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  // Входной массив x, содержащий n элементов.&lt;br /&gt;
  for (i = 0 to n - 1)&lt;br /&gt;
     int min = i;&lt;br /&gt;
        for (j = i + 1 to n - 1)&lt;br /&gt;
           if (x[j] &amp;lt; x[min])&lt;br /&gt;
              min = j;&lt;br /&gt;
     swap(x[i], x[min]);&lt;br /&gt;
  // Массив x отсортирован&lt;br /&gt;
&lt;br /&gt;
== Ссылки == &lt;br /&gt;
*[http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC Сортировка выбором в русской википедии]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом &amp;quot;Вильямс&amp;quot;, 2005. ISBN 5-8459-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Сортировки]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22564</id>
		<title>Сортировка выбором</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22564"/>
				<updated>2012-05-20T12:16:30Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: /* Алгоритм */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Сортировка выбором''' (англ. '''selection sort''') - это простой алгоритм сортировки со сложностью &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; - количество элементов для сортировки. Сортировка выбором предназначена для решения задачи сортировки (sorting problem).&lt;br /&gt;
&lt;br /&gt;
== Задача сортировки ==&lt;br /&gt;
'''На входе''' последовательность из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; чисел. &lt;br /&gt;
&lt;br /&gt;
'''На выходе''' отсортированная последовательность по неубыванию.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
[[file:Selection_sort.png|thumb|256px|Пример работы алгоритма для последовательности из 6 элементов]]&lt;br /&gt;
0. Назовем элементы массива списком.&lt;br /&gt;
&lt;br /&gt;
1. Находим номер минимального элемента из текущего списка.&lt;br /&gt;
&lt;br /&gt;
2. Меняем минимальный элемент с первым элементом списка.&lt;br /&gt;
&lt;br /&gt;
3. Если список пуст, то массив отсортирован. Иначе вернемся к шагу 1, убрав первый элемент из списка.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Пример'''&lt;br /&gt;
&lt;br /&gt;
Пусть дана последовательность из &amp;lt;tex&amp;gt;6&amp;lt;/tex&amp;gt; элементов &amp;lt;tex&amp;gt;5, 4, 1, 6, 2, 3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Белым фоном обозначен текущий список, зеленым отсортированная часть, а красным минимальный элемент.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  // Входной массив x, содержащий n элементов.&lt;br /&gt;
  for (i = 0 to n - 1)&lt;br /&gt;
     int min = i;&lt;br /&gt;
        for (j = i + 1 to n - 1)&lt;br /&gt;
           if (x[j] &amp;lt; x[min])&lt;br /&gt;
              min = j;&lt;br /&gt;
     swap(x[i], x[min]);&lt;br /&gt;
  // Массив x отсортирован&lt;br /&gt;
&lt;br /&gt;
== Ссылки == &lt;br /&gt;
*[http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC Сортировка выбором в русской википедии]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом &amp;quot;Вильямс&amp;quot;, 2005. ISBN 5-8459-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Сортировки]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22560</id>
		<title>Сортировка выбором</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22560"/>
				<updated>2012-05-20T12:11:26Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Сортировка выбором''' (англ. '''selection sort''') - это простой алгоритм сортировки со сложностью &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; - количество элементов для сортировки. Сортировка выбором предназначена для решения задачи сортировки (sorting problem).&lt;br /&gt;
&lt;br /&gt;
== Задача сортировки ==&lt;br /&gt;
'''На входе''' последовательность из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; чисел. &lt;br /&gt;
&lt;br /&gt;
'''На выходе''' отсортированная последовательность по неубыванию.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
[[file:Selection_sort.png|thumb|256px|Пример работы алгоритма]]&lt;br /&gt;
0. Назовем элементы массива списком.&lt;br /&gt;
&lt;br /&gt;
1. Находим номер минимального элемента из текущего списка.&lt;br /&gt;
&lt;br /&gt;
2. Меняем минимальный элемент с первым элементом списка.&lt;br /&gt;
&lt;br /&gt;
3. Если список пуст, то массив отсортирован. Иначе вернемся к шагу 1, убрав первый элемент из списка.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Пример'''&lt;br /&gt;
&lt;br /&gt;
Пусть дана последовательность из &amp;lt;tex&amp;gt;6&amp;lt;/tex&amp;gt; элементов &amp;lt;tex&amp;gt;5, 4, 1, 6, 2, 3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Белым фоном обозначен текущий список, зеленым отсортированная часть, а красным минимальный элемент.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  // Входной массив x, содержащий n элементов.&lt;br /&gt;
  for (i = 0 to n - 1)&lt;br /&gt;
     int min = i;&lt;br /&gt;
        for (j = i + 1 to n - 1)&lt;br /&gt;
           if (x[j] &amp;lt; x[min])&lt;br /&gt;
              min = j;&lt;br /&gt;
     swap(x[i], x[min]);&lt;br /&gt;
  // Массив x отсортирован&lt;br /&gt;
&lt;br /&gt;
== Ссылки == &lt;br /&gt;
*[http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC Сортировка выбором в русской википедии]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом &amp;quot;Вильямс&amp;quot;, 2005. ISBN 5-8459-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Сортировки]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22559</id>
		<title>Сортировка выбором</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22559"/>
				<updated>2012-05-20T12:10:11Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: /* Алгоритм */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Сортировка выбором''' (англ. '''selection sort''') - это простой алгоритм сортировки со сложностью &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; - количество элементов для сортировки. Сортировка выбором предназначена для решения задачи сортировки (sorting problem).&lt;br /&gt;
&lt;br /&gt;
== Задача сортировки ==&lt;br /&gt;
'''На входе''' последовательность из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; чисел. &lt;br /&gt;
&lt;br /&gt;
'''На выходе''' отсортированная последовательность по неубыванию.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
[[file:Selection_sort.png|thumb|280px|Пример работы алгоритма]]&lt;br /&gt;
0. Назовем элементы массива списком.&lt;br /&gt;
&lt;br /&gt;
1. Находим номер минимального элемента из текущего списка.&lt;br /&gt;
&lt;br /&gt;
2. Меняем минимальный элемент с первым элементом списка.&lt;br /&gt;
&lt;br /&gt;
3. Если список пуст, то массив отсортирован. Иначе вернемся к шагу 1, убрав первый элемент из списка.&lt;br /&gt;
&lt;br /&gt;
'''Пример'''&lt;br /&gt;
&lt;br /&gt;
Пусть дана последовательность из &amp;lt;tex&amp;gt;6&amp;lt;/tex&amp;gt; элементов &amp;lt;tex&amp;gt;5, 4, 1, 6, 2, 3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Белым фоном обозначен текущий список, зеленым отсортированная часть, а красным минимальный элемент.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  // Входной массив x, содержащий n элементов.&lt;br /&gt;
  for (i = 0 to n - 1)&lt;br /&gt;
     int min = i;&lt;br /&gt;
        for (j = i + 1 to n - 1)&lt;br /&gt;
           if (x[j] &amp;lt; x[min])&lt;br /&gt;
              min = j;&lt;br /&gt;
     swap(x[i], x[min]);&lt;br /&gt;
  // Массив x отсортирован&lt;br /&gt;
&lt;br /&gt;
== Ссылки == &lt;br /&gt;
*[http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC Сортировка выбором в русской википедии]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом &amp;quot;Вильямс&amp;quot;, 2005. ISBN 5-8459-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Сортировки]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Selection_sort.png&amp;diff=22558</id>
		<title>Файл:Selection sort.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Selection_sort.png&amp;diff=22558"/>
				<updated>2012-05-20T12:09:28Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: загружена новая версия «Файл:Selection sort.png»: Пошаговый пример сортировки выбором&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Пример сортировки выбором&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22556</id>
		<title>Сортировка выбором</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22556"/>
				<updated>2012-05-20T12:05:23Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Сортировка выбором''' (англ. '''selection sort''') - это простой алгоритм сортировки со сложностью &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; - количество элементов для сортировки. Сортировка выбором предназначена для решения задачи сортировки (sorting problem).&lt;br /&gt;
&lt;br /&gt;
== Задача сортировки ==&lt;br /&gt;
'''На входе''' последовательность из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; чисел. &lt;br /&gt;
&lt;br /&gt;
'''На выходе''' отсортированная последовательность по неубыванию.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
[[file:Selection_sort.png|thumb|300px|Пример работы алгоритма]]&lt;br /&gt;
0. Назовем элементы массива списком.&lt;br /&gt;
&lt;br /&gt;
1. Находим номер минимального элемента из текущего списка.&lt;br /&gt;
&lt;br /&gt;
2. Меняем минимальный элемент с первым элементом списка.&lt;br /&gt;
&lt;br /&gt;
3. Если список пуст, то массив отсортирован. Иначе вернемся к шагу 1, убрав первый элемент из списка.&lt;br /&gt;
&lt;br /&gt;
'''Пример'''&lt;br /&gt;
&lt;br /&gt;
Пусть дана последовательность из &amp;lt;tex&amp;gt;6&amp;lt;/tex&amp;gt; элементов &amp;lt;tex&amp;gt;5, 4, 1, 6, 2, 3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Белым фоном обозначен текущий список, зеленым отсортированная часть, а красным минимальный элемент.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  // Входной массив x, содержащий n элементов.&lt;br /&gt;
  for (i = 0 to n - 1)&lt;br /&gt;
     int min = i;&lt;br /&gt;
        for (j = i + 1 to n - 1)&lt;br /&gt;
           if (x[j] &amp;lt; x[min])&lt;br /&gt;
              min = j;&lt;br /&gt;
     swap(x[i], x[min]);&lt;br /&gt;
  // Массив x отсортирован&lt;br /&gt;
&lt;br /&gt;
== Ссылки == &lt;br /&gt;
*[http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC Сортировка выбором в русской википедии]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом &amp;quot;Вильямс&amp;quot;, 2005. ISBN 5-8459-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Сортировки]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Selection_sort.png&amp;diff=22554</id>
		<title>Файл:Selection sort.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Selection_sort.png&amp;diff=22554"/>
				<updated>2012-05-20T12:03:11Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: загружена новая версия «Файл:Selection sort.png»: Пример работы сортировки выбором&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Пример сортировки выбором&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22551</id>
		<title>Сортировка выбором</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22551"/>
				<updated>2012-05-20T11:54:15Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: /* Алгоритм */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Сортировка выбором''' (англ. '''selection sort''') - это простой алгоритм сортировки со сложностью &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; - количество элементов для сортировки. Сортировка выбором предназначена для решения задачи сортировки (sorting problem).&lt;br /&gt;
&lt;br /&gt;
== Задача сортировки ==&lt;br /&gt;
'''На входе''' последовательность из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; чисел. &lt;br /&gt;
&lt;br /&gt;
'''На выходе''' отсортированная последовательность по неубыванию.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
[[file:Selection_sort.png|thumb|150px|Пример работы алгоритма]]&lt;br /&gt;
0. Назовем элементы массива списком.&lt;br /&gt;
&lt;br /&gt;
1. Находим номер минимального элемента из текущего списка.&lt;br /&gt;
&lt;br /&gt;
2. Меняем минимальный элемент с первым элементом списка.&lt;br /&gt;
&lt;br /&gt;
3. Если список пуст, то массив отсортирован. Иначе вернемся к шагу 1, убрав первый элемент из списка.&lt;br /&gt;
&lt;br /&gt;
=== Пример ===&lt;br /&gt;
&lt;br /&gt;
Пусть дана последовательность из &amp;lt;tex&amp;gt;6&amp;lt;/tex&amp;gt; элементов &amp;lt;tex&amp;gt;5, 4, 1, 6, 2, 3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Белым фоном обозначен текущий список, зеленым отсортированная часть, а красным минимальный элемент.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  // Входной массив x, содержащий n элементов.&lt;br /&gt;
  for (i = 0 to n - 1)&lt;br /&gt;
     int min = i;&lt;br /&gt;
        for (j = i + 1 to n - 1)&lt;br /&gt;
           if (x[j] &amp;lt; x[min])&lt;br /&gt;
              min = j;&lt;br /&gt;
     swap(x[i], x[min]);&lt;br /&gt;
  // Массив x отсортирован&lt;br /&gt;
&lt;br /&gt;
== Ссылки == &lt;br /&gt;
*[http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC Сортировка выбором в русской википедии]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом &amp;quot;Вильямс&amp;quot;, 2005. ISBN 5-8459-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Сортировки]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22550</id>
		<title>Сортировка выбором</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22550"/>
				<updated>2012-05-20T11:52:51Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Сортировка выбором''' (англ. '''selection sort''') - это простой алгоритм сортировки со сложностью &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; - количество элементов для сортировки. Сортировка выбором предназначена для решения задачи сортировки (sorting problem).&lt;br /&gt;
&lt;br /&gt;
== Задача сортировки ==&lt;br /&gt;
'''На входе''' последовательность из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; чисел. &lt;br /&gt;
&lt;br /&gt;
'''На выходе''' отсортированная последовательность по неубыванию.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
[[file:Selection_sort.png|thumb|200px|Пример]]&lt;br /&gt;
0. Назовем элементы массива списком.&lt;br /&gt;
&lt;br /&gt;
1. Находим номер минимального элемента из текущего списка.&lt;br /&gt;
&lt;br /&gt;
2. Меняем минимальный элемент с первым элементом списка.&lt;br /&gt;
&lt;br /&gt;
3. Если список пуст, то массив отсортирован. Иначе вернемся к шагу 1, убрав первый элемент из списка.&lt;br /&gt;
&lt;br /&gt;
=== Пример ===&lt;br /&gt;
&lt;br /&gt;
Пусть дана последовательность из &amp;lt;tex&amp;gt;6&amp;lt;/tex&amp;gt; элементов &amp;lt;tex&amp;gt;5, 4, 1, 6, 2, 3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Белым фоном обозначен текущий список, зеленым отсортированная часть, а красным минимальный элемент.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  // Входной массив x, содержащий n элементов.&lt;br /&gt;
  for (i = 0 to n - 1)&lt;br /&gt;
     int min = i;&lt;br /&gt;
        for (j = i + 1 to n - 1)&lt;br /&gt;
           if (x[j] &amp;lt; x[min])&lt;br /&gt;
              min = j;&lt;br /&gt;
     swap(x[i], x[min]);&lt;br /&gt;
  // Массив x отсортирован&lt;br /&gt;
&lt;br /&gt;
== Ссылки == &lt;br /&gt;
*[http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC Сортировка выбором в русской википедии]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом &amp;quot;Вильямс&amp;quot;, 2005. ISBN 5-8459-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Сортировки]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22549</id>
		<title>Сортировка выбором</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22549"/>
				<updated>2012-05-20T11:50:44Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: /* Пример */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Сортировка выбором''' (англ. '''selection sort''') - это простой алгоритм сортировки со сложностью &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; - количество элементов для сортировки. Сортировка выбором предназначена для решения задачи сортировки (sorting problem).&lt;br /&gt;
&lt;br /&gt;
== Задача сортировки ==&lt;br /&gt;
'''На входе''' последовательность из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; чисел. &lt;br /&gt;
&lt;br /&gt;
'''На выходе''' отсортированная последовательность по неубыванию.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
0. Назовем элементы массива списком.&lt;br /&gt;
&lt;br /&gt;
1. Находим номер минимального элемента из текущего списка.&lt;br /&gt;
&lt;br /&gt;
2. Меняем минимальный элемент с первым элементом списка.&lt;br /&gt;
&lt;br /&gt;
3. Если список пуст, то массив отсортирован. Иначе вернемся к шагу 1, убрав первый элемент из списка.&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
[[file:Selection_sort.png|thumb|200px|Пример]]&lt;br /&gt;
&lt;br /&gt;
Пусть дана последовательность из &amp;lt;tex&amp;gt;6&amp;lt;/tex&amp;gt; элементов &amp;lt;tex&amp;gt;5, 4, 1, 6, 2, 3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Белым фоном обозначен текущий список, зеленым отсортированная часть, а красным минимальный элемент.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  // Входной массив x, содержащий n элементов.&lt;br /&gt;
  for (i = 0 to n - 1)&lt;br /&gt;
     int min = i;&lt;br /&gt;
        for (j = i + 1 to n - 1)&lt;br /&gt;
           if (x[j] &amp;lt; x[min])&lt;br /&gt;
              min = j;&lt;br /&gt;
     swap(x[i], x[min]);&lt;br /&gt;
  // Массив x отсортирован&lt;br /&gt;
&lt;br /&gt;
== Ссылки == &lt;br /&gt;
*[http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC Сортировка выбором в русской википедии]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом &amp;quot;Вильямс&amp;quot;, 2005. ISBN 5-8459-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Сортировки]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22548</id>
		<title>Сортировка выбором</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22548"/>
				<updated>2012-05-20T11:47:20Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: /* Пример */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Сортировка выбором''' (англ. '''selection sort''') - это простой алгоритм сортировки со сложностью &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; - количество элементов для сортировки. Сортировка выбором предназначена для решения задачи сортировки (sorting problem).&lt;br /&gt;
&lt;br /&gt;
== Задача сортировки ==&lt;br /&gt;
'''На входе''' последовательность из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; чисел. &lt;br /&gt;
&lt;br /&gt;
'''На выходе''' отсортированная последовательность по неубыванию.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
0. Назовем элементы массива списком.&lt;br /&gt;
&lt;br /&gt;
1. Находим номер минимального элемента из текущего списка.&lt;br /&gt;
&lt;br /&gt;
2. Меняем минимальный элемент с первым элементом списка.&lt;br /&gt;
&lt;br /&gt;
3. Если список пуст, то массив отсортирован. Иначе вернемся к шагу 1, убрав первый элемент из списка.&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана последовательность из &amp;lt;tex&amp;gt;6&amp;lt;/tex&amp;gt; элементов &amp;lt;tex&amp;gt;5, 4, 1, 6, 2, 3&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Белым фоном обозначен текущий список, зеленым отсортированная часть, а красным минимальный элемент. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Selection_sort.png]]&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  // Входной массив x, содержащий n элементов.&lt;br /&gt;
  for (i = 0 to n - 1)&lt;br /&gt;
     int min = i;&lt;br /&gt;
        for (j = i + 1 to n - 1)&lt;br /&gt;
           if (x[j] &amp;lt; x[min])&lt;br /&gt;
              min = j;&lt;br /&gt;
     swap(x[i], x[min]);&lt;br /&gt;
  // Массив x отсортирован&lt;br /&gt;
&lt;br /&gt;
== Ссылки == &lt;br /&gt;
*[http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC Сортировка выбором в русской википедии]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом &amp;quot;Вильямс&amp;quot;, 2005. ISBN 5-8459-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Сортировки]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Selection_sort.png&amp;diff=22547</id>
		<title>Файл:Selection sort.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Selection_sort.png&amp;diff=22547"/>
				<updated>2012-05-20T11:43:38Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: Пример сортировки выбором&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Пример сортировки выбором&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22543</id>
		<title>Сортировка выбором</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22543"/>
				<updated>2012-05-20T11:05:27Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Сортировка выбором''' (англ. '''selection sort''') - это простой алгоритм сортировки со сложностью &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; - количество элементов для сортировки. Сортировка выбором предназначена для решения задачи сортировки (sorting problem).&lt;br /&gt;
&lt;br /&gt;
== Задача сортировки ==&lt;br /&gt;
'''На входе''' последовательность из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; чисел. &lt;br /&gt;
&lt;br /&gt;
'''На выходе''' отсортированная последовательность по неубыванию.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
0. Назовем элементы массива списком.&lt;br /&gt;
&lt;br /&gt;
1. Находим номер минимального элемента из текущего списка.&lt;br /&gt;
&lt;br /&gt;
2. Меняем минимальный элемент с первым элементом списка.&lt;br /&gt;
&lt;br /&gt;
3. Если список пуст, то массив отсортирован. Иначе вернемся к шагу 1, убрав первый элемент из списка.&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
&lt;br /&gt;
Пусть дана последовательность из 5 элементов.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  // Входной массив x, содержащий n элементов.&lt;br /&gt;
  for (i = 0 to n - 1)&lt;br /&gt;
     int min = i;&lt;br /&gt;
        for (j = i + 1 to n - 1)&lt;br /&gt;
           if (x[j] &amp;lt; x[min])&lt;br /&gt;
              min = j;&lt;br /&gt;
     swap(x[i], x[min]);&lt;br /&gt;
  // Массив x отсортирован&lt;br /&gt;
&lt;br /&gt;
== Ссылки == &lt;br /&gt;
*[http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC Сортировка выбором в русской википедии]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом &amp;quot;Вильямс&amp;quot;, 2005. ISBN 5-8459-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Сортировки]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22542</id>
		<title>Сортировка выбором</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22542"/>
				<updated>2012-05-20T11:03:06Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: /* Алгоритм */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Сортировка выбором''' (англ. '''selection sort''') - это простой алгоритм сортировки со сложностью &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; - количество элементов для сортировки. Сортировка выбором предназначена для решения задачи сортировки (sorting problem).&lt;br /&gt;
&lt;br /&gt;
== Задача сортировки ==&lt;br /&gt;
'''На входе''' последовательность из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; чисел. &lt;br /&gt;
&lt;br /&gt;
'''На выходе''' отсортированная последовательность по неубыванию.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
0. Назовем элементы массива списком.&lt;br /&gt;
&lt;br /&gt;
1. Находим номер минимального элемента из текущего списка.&lt;br /&gt;
&lt;br /&gt;
2. Меняем минимальный элемент с первым элементом списка.&lt;br /&gt;
&lt;br /&gt;
3. Если список пуст, то массив отсортирован. Иначе вернемся к шагу 1, убрав первый элемент из списка.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  // Входной массив x, содержащий n элементов.&lt;br /&gt;
  for (i = 0 to n - 1)&lt;br /&gt;
     int min = i;&lt;br /&gt;
        for (j = i + 1 to n - 1)&lt;br /&gt;
           if (x[j] &amp;lt; x[min])&lt;br /&gt;
              min = j;&lt;br /&gt;
     swap(x[i], x[min]);&lt;br /&gt;
  // Массив x отсортирован&lt;br /&gt;
&lt;br /&gt;
== Ссылки == &lt;br /&gt;
*[http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC Сортировка выбором в русской википедии]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом &amp;quot;Вильямс&amp;quot;, 2005. ISBN 5-8459-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Сортировки]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22541</id>
		<title>Сортировка выбором</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22541"/>
				<updated>2012-05-20T10:49:28Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: /* Задача сортировки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Сортировка выбором''' (англ. '''selection sort''') - это простой алгоритм сортировки со сложностью &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; - количество элементов для сортировки. Сортировка выбором предназначена для решения задачи сортировки (sorting problem).&lt;br /&gt;
&lt;br /&gt;
== Задача сортировки ==&lt;br /&gt;
'''На входе''' последовательность из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; чисел. &lt;br /&gt;
&lt;br /&gt;
'''На выходе''' отсортированная последовательность по неубыванию.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
&lt;br /&gt;
1. Находим номер минимального элемента из массива.&lt;br /&gt;
&lt;br /&gt;
2. Меняем минимальный элемент с первым.&lt;br /&gt;
&lt;br /&gt;
3. Новый массив начинается со следующего элемента, так как все предыдущие элементы уже отсортированы. Перейти к шагу 1, если массив не пустой.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  // Входной массив x, содержащий n элементов.&lt;br /&gt;
  for (i = 0 to n - 1)&lt;br /&gt;
     int min = i;&lt;br /&gt;
        for (j = i + 1 to n - 1)&lt;br /&gt;
           if (x[j] &amp;lt; x[min])&lt;br /&gt;
              min = j;&lt;br /&gt;
     swap(x[i], x[min]);&lt;br /&gt;
  // Массив x отсортирован&lt;br /&gt;
&lt;br /&gt;
== Ссылки == &lt;br /&gt;
*[http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC Сортировка выбором в русской википедии]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом &amp;quot;Вильямс&amp;quot;, 2005. ISBN 5-8459-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Сортировки]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22540</id>
		<title>Сортировка выбором</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22540"/>
				<updated>2012-05-20T10:47:59Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: /* Задача сортировки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Сортировка выбором''' (англ. '''selection sort''') - это простой алгоритм сортировки со сложностью &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; - количество элементов для сортировки. Сортировка выбором предназначена для решения задачи сортировки (sorting problem).&lt;br /&gt;
&lt;br /&gt;
== Задача сортировки ==&lt;br /&gt;
'''На входе''' последовательность из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; чисел. &lt;br /&gt;
&lt;br /&gt;
'''На выходе''' отсортированная последовательность по возрастанию.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
&lt;br /&gt;
1. Находим номер минимального элемента из массива.&lt;br /&gt;
&lt;br /&gt;
2. Меняем минимальный элемент с первым.&lt;br /&gt;
&lt;br /&gt;
3. Новый массив начинается со следующего элемента, так как все предыдущие элементы уже отсортированы. Перейти к шагу 1, если массив не пустой.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  // Входной массив x, содержащий n элементов.&lt;br /&gt;
  for (i = 0 to n - 1)&lt;br /&gt;
     int min = i;&lt;br /&gt;
        for (j = i + 1 to n - 1)&lt;br /&gt;
           if (x[j] &amp;lt; x[min])&lt;br /&gt;
              min = j;&lt;br /&gt;
     swap(x[i], x[min]);&lt;br /&gt;
  // Массив x отсортирован&lt;br /&gt;
&lt;br /&gt;
== Ссылки == &lt;br /&gt;
*[http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC Сортировка выбором в русской википедии]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом &amp;quot;Вильямс&amp;quot;, 2005. ISBN 5-8459-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Сортировки]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22539</id>
		<title>Сортировка выбором</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22539"/>
				<updated>2012-05-20T10:46:15Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: /* Задача сортировки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Сортировка выбором''' (англ. '''selection sort''') - это простой алгоритм сортировки со сложностью &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; - количество элементов для сортировки. Сортировка выбором предназначена для решения задачи сортировки (sorting problem).&lt;br /&gt;
&lt;br /&gt;
== Задача сортировки ==&lt;br /&gt;
'''На входе''' последовательность из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; чисел (&amp;lt;tex&amp;gt;x_1, x_2, ..., x_n&amp;lt;/tex&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''На выходе''' отсортированная последовательность (&amp;lt;tex&amp;gt;{x_1}^{'}, {x_2}^{'}, ..., {x_n}^{'}&amp;lt;/tex&amp;gt;) таким образом, что для ее членов выполняется &amp;lt;tex&amp;gt;{x_1}^{'} \le {x_2}^{'} \le ... \le {x_n}^{'}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
&lt;br /&gt;
1. Находим номер минимального элемента из массива.&lt;br /&gt;
&lt;br /&gt;
2. Меняем минимальный элемент с первым.&lt;br /&gt;
&lt;br /&gt;
3. Новый массив начинается со следующего элемента, так как все предыдущие элементы уже отсортированы. Перейти к шагу 1, если массив не пустой.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  // Входной массив x, содержащий n элементов.&lt;br /&gt;
  for (i = 0 to n - 1)&lt;br /&gt;
     int min = i;&lt;br /&gt;
        for (j = i + 1 to n - 1)&lt;br /&gt;
           if (x[j] &amp;lt; x[min])&lt;br /&gt;
              min = j;&lt;br /&gt;
     swap(x[i], x[min]);&lt;br /&gt;
  // Массив x отсортирован&lt;br /&gt;
&lt;br /&gt;
== Ссылки == &lt;br /&gt;
*[http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC Сортировка выбором в русской википедии]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом &amp;quot;Вильямс&amp;quot;, 2005. ISBN 5-8459-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Сортировки]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22532</id>
		<title>Сортировка выбором</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22532"/>
				<updated>2012-05-20T09:49:54Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: /* Алгоритм */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Сортировка выбором''' (англ. '''selection sort''') - это простой алгоритм сортировки со сложностью &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; - количество элементов для сортировки. Сортировка выбором предназначена для решения задачи сортировки (sorting problem).&lt;br /&gt;
&lt;br /&gt;
== Задача сортировки ==&lt;br /&gt;
'''На входе''' последовательность из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; чисел (&amp;lt;tex&amp;gt;x_1, x_2, ..., x_n&amp;lt;/tex&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''На выходе''' перестановка данной последовательности (&amp;lt;tex&amp;gt;{x_1}^{'}, {x_2}^{'}, ..., {x_n}^{'}&amp;lt;/tex&amp;gt;) таким образом, что для ее членов выполняется &amp;lt;tex&amp;gt;{x_1}^{'} \le {x_2}^{'} \le ... \le {x_n}^{'}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
&lt;br /&gt;
1. Находим номер минимального элемента из массива.&lt;br /&gt;
&lt;br /&gt;
2. Меняем минимальный элемент с первым.&lt;br /&gt;
&lt;br /&gt;
3. Новый массив начинается со следующего элемента, так как все предыдущие элементы уже отсортированы. Перейти к шагу 1, если массив не пустой.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  // Входной массив x, содержащий n элементов.&lt;br /&gt;
  for (i = 0 to n - 1)&lt;br /&gt;
     int min = i;&lt;br /&gt;
        for (j = i + 1 to n - 1)&lt;br /&gt;
           if (x[j] &amp;lt; x[min])&lt;br /&gt;
              min = j;&lt;br /&gt;
     swap(x[i], x[min]);&lt;br /&gt;
  // Массив x отсортирован&lt;br /&gt;
&lt;br /&gt;
== Ссылки == &lt;br /&gt;
*[http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC Сортировка выбором в русской википедии]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом &amp;quot;Вильямс&amp;quot;, 2005. ISBN 5-8459-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Сортировки]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22280</id>
		<title>Сортировка выбором</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22280"/>
				<updated>2012-05-13T12:38:42Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Сортировка выбором''' (англ. '''selection sort''') - это простой алгоритм сортировки со сложностью &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; - количество элементов для сортировки. Сортировка выбором предназначена для решения задачи сортировки (sorting problem).&lt;br /&gt;
&lt;br /&gt;
== Задача сортировки ==&lt;br /&gt;
'''На входе''' последовательность из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; чисел (&amp;lt;tex&amp;gt;x_1, x_2, ..., x_n&amp;lt;/tex&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''На выходе''' перестановка данной последовательности (&amp;lt;tex&amp;gt;{x_1}^{'}, {x_2}^{'}, ..., {x_n}^{'}&amp;lt;/tex&amp;gt;) таким образом, что для ее членов выполняется &amp;lt;tex&amp;gt;{x_1}^{'} \le {x_2}^{'} \le ... \le {x_n}^{'}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
&lt;br /&gt;
Шаг 1. Выбираем минимальный элемент из текущего массива.&lt;br /&gt;
&lt;br /&gt;
Шаг 2. Ставим его на первое место.&lt;br /&gt;
&lt;br /&gt;
Шаг 3. Новый массив начинается со следующего элемента. Перейти к шагу 1, если массив не пустой.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  // Входной массив x, содержащий n элементов.&lt;br /&gt;
  for (i = 0 to n - 1)&lt;br /&gt;
     int min = i;&lt;br /&gt;
        for (j = i + 1 to n - 1)&lt;br /&gt;
           if (x[j] &amp;lt; x[min])&lt;br /&gt;
              min = j;&lt;br /&gt;
     swap(x[i], x[min]);&lt;br /&gt;
  // Массив x отсортирован&lt;br /&gt;
&lt;br /&gt;
== Ссылки == &lt;br /&gt;
*[http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC Сортировка выбором в русской википедии]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом &amp;quot;Вильямс&amp;quot;, 2005. ISBN 5-8459-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Сортировки]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22279</id>
		<title>Сортировка выбором</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22279"/>
				<updated>2012-05-13T12:37:21Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Сортировка выбором''' (англ. '''selection sort''') - это простой алгоритм сортировки со сложностью &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; - количество элементов для сортировки. Сортировка выбором предназначена для решения задачи сортировки (sorting problem).&lt;br /&gt;
&lt;br /&gt;
== Задача сортировки ==&lt;br /&gt;
'''На входе''' последовательность из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; чисел (&amp;lt;tex&amp;gt;x_1, x_2, ..., x_n&amp;lt;/tex&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''На выходе''' перестановка данной последовательности (&amp;lt;tex&amp;gt;{x_1}^{'}, {x_2}^{'}, ..., {x_n}^{'}&amp;lt;/tex&amp;gt;) таким образом, что для ее членов выполняется &amp;lt;tex&amp;gt;{x_1}^{'} \le {x_2}^{'} \le ... \le {x_n}^{'}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
&lt;br /&gt;
Шаг 1. Выбираем минимальный элемент из текущего массива.&lt;br /&gt;
&lt;br /&gt;
Шаг 2. Ставим его на первое место.&lt;br /&gt;
&lt;br /&gt;
Шаг 3. Новый массив начинается со следующего элемента. Перейти к шагу 1, если массив не пустой.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  // Входной массив x, содержащий n элементов.&lt;br /&gt;
  for (i = 0 to n - 1)&lt;br /&gt;
     int min = i;&lt;br /&gt;
        for (j = i + 1 to n - 1)&lt;br /&gt;
           if (x[j] &amp;lt; x[min])&lt;br /&gt;
              min = j;&lt;br /&gt;
     swap(x[i], x[min]);&lt;br /&gt;
  // Массив x отсортирован&lt;br /&gt;
&lt;br /&gt;
== Ссылки == &lt;br /&gt;
*[http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC Сортировка выбором в русской википедии]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом &amp;quot;Вильямс&amp;quot;, 2005. ISBN 5-8459-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Алгоритмы сортировки]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22278</id>
		<title>Сортировка выбором</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22278"/>
				<updated>2012-05-13T12:35:04Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Сортировка выбором''' (англ. '''selection sort''') - это простой алгоритм сортировки со сложностью &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; - количество элементов для сортировки. Сортировка выбором предназначена для решения задачи сортировки (sorting problem).&lt;br /&gt;
&lt;br /&gt;
== Задача сортировки ==&lt;br /&gt;
'''На входе''' последовательность из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; чисел (&amp;lt;tex&amp;gt;x_1, x_2, ..., x_n&amp;lt;/tex&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''На выходе''' перестановка данной последовательности (&amp;lt;tex&amp;gt;{x_1}^{'}, {x_2}^{'}, ..., {x_n}^{'}&amp;lt;/tex&amp;gt;) таким образом, что для ее членов выполняется &amp;lt;tex&amp;gt;{x_1}^{'} \le {x_2}^{'} \le ... \le {x_n}^{'}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
&lt;br /&gt;
Шаг 1. Выбираем минимальный элемент из текущего массива.&lt;br /&gt;
&lt;br /&gt;
Шаг 2. Ставим его на первое место.&lt;br /&gt;
&lt;br /&gt;
Шаг 3. Новый массив начинается со следующего элемента. Перейти к шагу 1, если массив не пустой.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  // Входной массив x, содержащий n элементов.&lt;br /&gt;
  for (i = 0 to n - 1)&lt;br /&gt;
     int min = i;&lt;br /&gt;
        for (j = i + 1 to n - 1)&lt;br /&gt;
           if (x[j] &amp;lt; x[min])&lt;br /&gt;
              min = j;&lt;br /&gt;
     swap(x[i], x[min]);&lt;br /&gt;
  // Массив x отсортирован&lt;br /&gt;
&lt;br /&gt;
== Ссылки == &lt;br /&gt;
*[http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC Сортировка выбором в русской википедии]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом &amp;quot;Вильямс&amp;quot;, 2005. ISBN 5-8459-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика, алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Сортировка]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B8%D1%81%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D0%B0%D1%8F_%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0,_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=22277</id>
		<title>Дискретная математика, алгоритмы и структуры данных</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B8%D1%81%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D0%B0%D1%8F_%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0,_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=22277"/>
				<updated>2012-05-13T12:27:10Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: /* Сортировка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Категория:Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
&lt;br /&gt;
Убедительная просьба читать [[Обсуждение:Дискретная_математика_и_алгоритмы | правила оформления вики-конспектов]].&lt;br /&gt;
&lt;br /&gt;
= Первый семестр =&lt;br /&gt;
&lt;br /&gt;
== Отношения ==&lt;br /&gt;
*[[Определение отношения]]&lt;br /&gt;
*[[Степень отношений]]&lt;br /&gt;
*[[Рефлексивное отношение|Рефлексивное отношение. Антирефлексивное отношение.]]&lt;br /&gt;
*[[Симметричное отношение]]&lt;br /&gt;
*[[Антисимметричное отношение]]&lt;br /&gt;
*[[Композиция отношений|Композиция отношений. Обратное отношение]]&lt;br /&gt;
*[[Транзитивное отношение]]&lt;br /&gt;
*[[Транзитивное замыкание|Транзитивное замыкание отношения]]&lt;br /&gt;
*[[Транзитивный остов]]&lt;br /&gt;
*[[Отношение порядка]]&lt;br /&gt;
*[[Отношение эквивалентности]]&lt;br /&gt;
*[[Алгоритм Флойда — Уоршелла|Алгоритм Флойда-Уоршалла построения транзитивного замыкания отношения]]&lt;br /&gt;
&lt;br /&gt;
== Булевы функции ==&lt;br /&gt;
*[[Определение булевой функции]]&lt;br /&gt;
*[[Суперпозиции]]&lt;br /&gt;
*[[ДНФ]]&lt;br /&gt;
*[[КНФ]]&lt;br /&gt;
*[[Полином Жегалкина]]&lt;br /&gt;
*[[Полные системы функций. Теорема Поста о полной системе функций]]&lt;br /&gt;
*[[Сокращенная и минимальная ДНФ]]&lt;br /&gt;
*[[Минимизация ДНФ с помощью покрытий гиперкуба и карт Карно]]&lt;br /&gt;
*[[Специальные формы КНФ|Специальные формы КНФ: КНФ в форме Хорна и КНФ в форме Крома]]&lt;br /&gt;
*[[Преобразование Мёбиуса для получения коэффициентов полинома Жегалкина]]&lt;br /&gt;
*[[Представление функции класса DM с помощью медианы]]&lt;br /&gt;
*[[Пороговая функция]]&lt;br /&gt;
&lt;br /&gt;
== Схемы из функциональных элементов ==&lt;br /&gt;
*[[Реализация булевой функции схемой из функциональных элементов]]&lt;br /&gt;
*[[Cумматор]]&lt;br /&gt;
*[[Каскадный сумматор]]&lt;br /&gt;
*[[Двоичный каскадный сумматор]]&lt;br /&gt;
*[[Реализация вычитания сумматором]]&lt;br /&gt;
*[[Матричный умножитель]]&lt;br /&gt;
*[[Дерево Уоллеса]]&lt;br /&gt;
&lt;br /&gt;
== Представление информации ==&lt;br /&gt;
*[[Кодирование информации]]&lt;br /&gt;
*[[Представление целых чисел: прямой код, код со сдвигом, дополнительный код]]&lt;br /&gt;
*[[Представление вещественных чисел]]&lt;br /&gt;
*[[Представление символов, таблицы кодировок]]&lt;br /&gt;
&lt;br /&gt;
== Алгоритмы сжатия ==&lt;br /&gt;
*[[Алгоритм Хаффмана]]&lt;br /&gt;
*[[Алгоритм LZW]]&lt;br /&gt;
*[[Алгоритмы LZ77 и LZ78]]&lt;br /&gt;
*[[Преобразование Барроуза-Уиллера]]&lt;br /&gt;
*[[Обратное преобразование Барроуза-Уиллера]]&lt;br /&gt;
*[[Преобразование MTF]]&lt;br /&gt;
*[[Расстояние Хэмминга]]&lt;br /&gt;
*[[Избыточное кодирование, код Хэмминга]]&lt;br /&gt;
*[[Неравенство Крафта]]&lt;br /&gt;
*[[Неравенство Макмиллана]]&lt;br /&gt;
&lt;br /&gt;
== Комбинаторика ==&lt;br /&gt;
*[[Комбинаторные объекты]]&lt;br /&gt;
*[[Лексикографический порядок]]&lt;br /&gt;
*[[Формула включения-исключения]]&lt;br /&gt;
*[[Генерация комбинаторных объектов в лексикографическом порядке]]&lt;br /&gt;
*[[Получение номера по объекту]]&lt;br /&gt;
*[[Получение объекта по номеру]]&lt;br /&gt;
*[[Получение следующего объекта]]&lt;br /&gt;
*[[Коды Грея]]&lt;br /&gt;
*[[Коды Грея для перестановок]]&lt;br /&gt;
*[[Цепные коды]]&lt;br /&gt;
*[[Правильные скобочные последовательности]]&lt;br /&gt;
*[[Действие перестановки на набор из элементов, представление в виде циклов]]&lt;br /&gt;
*[[Метод генерации случайной перестановки, алгоритм Фишера-Йетса]]&lt;br /&gt;
*[[Таблица инверсий]]&lt;br /&gt;
*[[Умножение перестановок, обратная перестановка, группа перестановок]]&lt;br /&gt;
*[[Теорема Кэли]]&lt;br /&gt;
*[[Матричное представление перестановок]]&lt;br /&gt;
*[[Задача о минимуме/максимуме скалярного произведения]]&lt;br /&gt;
*[[Задача о монотонных подпоследовательностях, теорема о связи длины НВП и НУП]]&lt;br /&gt;
*[[Нахождение количества разбиений числа на слагаемые | Нахождение количества разбиений числа на слагаемые. Пентагональная теорема Эйлера]]&lt;br /&gt;
*[[Производящая функция]]&lt;br /&gt;
&lt;br /&gt;
== [[Динамическое программирование]] ==&lt;br /&gt;
*[[Кратчайший путь в ациклическом графе]]&lt;br /&gt;
*[[Задача о расстановке знаков в выражении]]&lt;br /&gt;
*[[Задача о наибольшей общей подпоследовательности]]&lt;br /&gt;
*[[Задача о порядке перемножения матриц]]&lt;br /&gt;
*[[Задача о наибольшей возрастающей подпоследовательности]]&lt;br /&gt;
*[[Задача о паросочетании максимального веса в дереве, амортизированные оценки для ДП на дереве]]&lt;br /&gt;
*[[Метод четырех русских для умножения матриц]]&lt;br /&gt;
*[[Применение метода четырех русских в задачах ДП на примере задачи о НОП]]&lt;br /&gt;
*[[Задача коммивояжера, ДП по подмножествам]]&lt;br /&gt;
*[[Задача о выводе в контекстно-свободной грамматике, алгоритм Кока-Янгера-Касами]]&lt;br /&gt;
*[[Задача о редакционном расстоянии, алгоритм Вагнера-Фишера]]&lt;br /&gt;
*[[Задача о расстоянии Дамерау-Левенштейна]]&lt;br /&gt;
*[[Задача об оптимальном префиксном коде с сохранением порядка. Монотонность точки разреза]]&lt;br /&gt;
&lt;br /&gt;
== Теория вероятностей ==&lt;br /&gt;
*[[Вероятностное пространство, элементарный исход, событие]]&lt;br /&gt;
*[[Независимые события]]&lt;br /&gt;
*[[Условная вероятность]]&lt;br /&gt;
*[[Формула Байеса]]&lt;br /&gt;
*[[Формула полной вероятности]]&lt;br /&gt;
*[[Дискретная случайная величина]]&lt;br /&gt;
*[[Независимые случайные величины]]&lt;br /&gt;
*[[Математическое ожидание случайной величины]]&lt;br /&gt;
*[[Ковариация случайных величин]]&lt;br /&gt;
*[[Дисперсия случайной величины]]&lt;br /&gt;
*[[Энтропия случайного источника]]&lt;br /&gt;
*[[Симуляция одним распределением другого]]&lt;br /&gt;
*[[Арифметическое кодирование]]&lt;br /&gt;
*[[Задача о двух конвертах]]&lt;br /&gt;
&lt;br /&gt;
== [[Марковская цепь|Марковские цепи]] ==&lt;br /&gt;
&lt;br /&gt;
* [[Теорема о поглощении]]&lt;br /&gt;
* [[Фундаментальная матрица]]&lt;br /&gt;
* [[Математическое ожидание времени поглощения]]&lt;br /&gt;
* [[Расчет вероятности поглощения в состоянии]]&lt;br /&gt;
* [[Эргодическая марковская цепь]]&lt;br /&gt;
* [[Регулярная марковская цепь]]&lt;br /&gt;
&lt;br /&gt;
= Второй семестр =&lt;br /&gt;
&lt;br /&gt;
== Амортизационный анализ ==&lt;br /&gt;
* [[Амортизационный анализ]]&lt;br /&gt;
* [[Саморасширяющийся массив]]&lt;br /&gt;
* [[Массив с увеличением/уменьшением размера]]&lt;br /&gt;
* [[Стек]]&lt;br /&gt;
* [[Очередь]]&lt;br /&gt;
* [[Список]]&lt;br /&gt;
* [[Персистентный стек]]&lt;br /&gt;
* [[Персистентный дек]]&lt;br /&gt;
&lt;br /&gt;
== Приоритетные очереди ==&lt;br /&gt;
&lt;br /&gt;
* [[Двоичная куча]]&lt;br /&gt;
* [[Биномиальная куча]]&lt;br /&gt;
* [[Фибоначчиева куча]]&lt;br /&gt;
&lt;br /&gt;
== Система непересекающихся множеств ==&lt;br /&gt;
* [[СНМ (наивные реализации) | Наивные реализации]]&lt;br /&gt;
* [[СНМ (списки с весовой эвристикой) | Списки с весовой эвристикой]]&lt;br /&gt;
* [[СНМ(реализация с помощью леса корневых деревьев) | Реализация с помощью леса корневых деревьев]]&lt;br /&gt;
* [[Анализ реализации с ранговой эвристикой  | Анализ реализации с ранговой эвристикой]]&lt;br /&gt;
&lt;br /&gt;
== Деревья поиска ==&lt;br /&gt;
* [[Упорядоченное множество]]&lt;br /&gt;
* [[Дерево поиска, наивная реализация]]&lt;br /&gt;
* [[АВЛ-дерево]]&lt;br /&gt;
* [[2-3 дерево]]&lt;br /&gt;
* [[B-дерево]]&lt;br /&gt;
* [[Красно-черное дерево]]&lt;br /&gt;
* [[Декартово дерево]]&lt;br /&gt;
* [[Splay-дерево]]&lt;br /&gt;
* [[Декартово дерево по неявному ключу]]&lt;br /&gt;
* [[Дерево ван Эмде Боаса]]&lt;br /&gt;
* [[Рандомизированное бинарное дерево поиска]]&lt;br /&gt;
&lt;br /&gt;
== Дерево отрезков ==&lt;br /&gt;
&lt;br /&gt;
* [[Статистики на отрезках. Корневая эвристика]]&lt;br /&gt;
* [[Дерево отрезков. Построение]]&lt;br /&gt;
* [[Реализация запроса в дереве отрезков сверху]]&lt;br /&gt;
* [[Реализация запроса в дереве отрезков снизу]]&lt;br /&gt;
* [[Несогласованные поддеревья. Реализация массового обновления]]&lt;br /&gt;
* [[Многомерное дерево отрезков]]&lt;br /&gt;
* [[Сжатое многомерное дерево отрезков]]&lt;br /&gt;
&lt;br /&gt;
== Дерево Фенвика ==&lt;br /&gt;
* [[Дерево Фенвика]]&lt;br /&gt;
* [[Встречное дерево Фенвика]]&lt;br /&gt;
* [[Дерево Фенвика для некоммутативных операций]]&lt;br /&gt;
* [[Многомерное дерево Фенвика]]&lt;br /&gt;
&lt;br /&gt;
== Хеширование ==&lt;br /&gt;
* [[Хеширование]]&lt;br /&gt;
* [[Открытое и закрытое хеширование]]&lt;br /&gt;
* [[Поиск свободного места при закрытом хешировании]]&lt;br /&gt;
* [[Хеширование кукушки]]&lt;br /&gt;
* [[Двойное хеширование]]&lt;br /&gt;
* [[Перехеширование. Амортизационный анализ]]&lt;br /&gt;
* [[Фильтр Блума]]&lt;br /&gt;
* [[Универсальное семейство хеш-функций]]&lt;br /&gt;
&lt;br /&gt;
== Сортировка ==&lt;br /&gt;
* [[Сортировка выбором]]&lt;br /&gt;
* [[Сортировка пузырьком]]&lt;br /&gt;
* [[Сортировка слиянием]]&lt;br /&gt;
* [[Cортировка слиянием с использованием O(1) дополнительной памяти]]&lt;br /&gt;
* [[Сортировка вставками]]&lt;br /&gt;
* [[Сортировка подсчетом]]&lt;br /&gt;
* [[Сортировка подсчетом сложных объектов]]&lt;br /&gt;
* [[Цифровая сортировка]]&lt;br /&gt;
* [[Поиск k-ой порядковой статистики]]&lt;br /&gt;
* [[Поиск k-й порядковой статистики за линейное время]]&lt;br /&gt;
* [[Теорема о нижней оценке для сортировки сравнениями]]&lt;br /&gt;
* [[Быстрая сортировка]]&lt;br /&gt;
&lt;br /&gt;
== [[Сортирующие сети]] ==&lt;br /&gt;
* [[0-1 принцип | Проверка сети компараторов на то, что она сортирующая. 0-1 принцип]]&lt;br /&gt;
* [[Сортирующие сети для квадратичных сортировок]]&lt;br /&gt;
* [[Сеть Бетчера]]&lt;br /&gt;
&lt;br /&gt;
== Алгоритмы поиска ==&lt;br /&gt;
* [[Троичный поиск]]&lt;br /&gt;
* [[Поиск с помощью золотого сечения]]&lt;br /&gt;
* [[Интерполяционный поиск]]&lt;br /&gt;
* [[Вещественный двоичный поиск]]&lt;br /&gt;
&lt;br /&gt;
= Третий семестр =&lt;br /&gt;
&lt;br /&gt;
== Основные определения теории графов ==&lt;br /&gt;
* [[Основные определения теории графов|Основные определения: граф, ребро, вершина, степень, петля, путь, цикл]]&lt;br /&gt;
* [[Лемма о рукопожатиях]]&lt;br /&gt;
* [[Теорема о существовании простого пути в случае существования пути]]&lt;br /&gt;
* [[Теорема о существовании простого цикла в случае существования цикла]]&lt;br /&gt;
* [[Матрица смежности графа]]&lt;br /&gt;
* [[Связь степени матрицы смежности и количества путей]]&lt;br /&gt;
* [[Матрица инцидентности графа]]&lt;br /&gt;
* [[Циклическое пространство графа]]&lt;br /&gt;
* [[Фундаментальные циклы графа]]&lt;br /&gt;
* [[Дерево, эквивалентные определения]]&lt;br /&gt;
&lt;br /&gt;
== Связность в графах ==&lt;br /&gt;
* [[Отношение связности, компоненты связности]]&lt;br /&gt;
* [[Отношение реберной двусвязности]]&lt;br /&gt;
* [[Отношение вершинной двусвязности]]&lt;br /&gt;
* [[Граф компонент реберной двусвязности]]&lt;br /&gt;
* [[Граф блоков-точек сочленения]]&lt;br /&gt;
* [[Точка сочленения, эквивалентные определения]]&lt;br /&gt;
* [[Мост, эквивалентные определения]]&lt;br /&gt;
* [[k-связность]]&lt;br /&gt;
* [[Теорема Менгера]]&lt;br /&gt;
* [[Теорема Менгера, альтернативное доказательство]]&lt;br /&gt;
* [[Вершинная, реберная связность, связь между ними и минимальной степенью вершины]]&lt;br /&gt;
&lt;br /&gt;
== Остовные деревья ==&lt;br /&gt;
* [[Матрица Кирхгофа]]&lt;br /&gt;
* [[Связь матрицы Кирхгофа и матрицы инцидентности]]&lt;br /&gt;
* [[Подсчет числа остовных деревьев с помощью матрицы Кирхгофа]]&lt;br /&gt;
* [[Количество помеченных деревьев]]&lt;br /&gt;
* [[Коды Прюфера]]&lt;br /&gt;
&lt;br /&gt;
== Обходы графов ==&lt;br /&gt;
* [[Эйлеров цикл, Эйлеров путь, Эйлеровы графы, Эйлеровость орграфов]]&lt;br /&gt;
* [[Покрытие ребер графа путями]]&lt;br /&gt;
* [[Алгоритм построения Эйлерова цикла]]&lt;br /&gt;
* [[Произвольно вычерчиваемые из заданной вершины графы]]&lt;br /&gt;
* [[Гамильтоновы графы]]&lt;br /&gt;
* [[Теорема Хватала]]&lt;br /&gt;
* Следствия теоремы Хватала: &lt;br /&gt;
** [[Теорема Дирака]]&lt;br /&gt;
* [[Теорема Оре]]&lt;br /&gt;
* [[Турниры]]&lt;br /&gt;
* [[Теорема Редеи-Камиона]]&lt;br /&gt;
&lt;br /&gt;
== Укладки графов ==&lt;br /&gt;
* [[Укладка графа на плоскости]]&lt;br /&gt;
* [[Формула Эйлера]]&lt;br /&gt;
* [[Непланарность K5 и K3,3|Непланарность &amp;lt;tex&amp;gt;K_5&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;K_{3,3}&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
* [[Укладка дерева]]&lt;br /&gt;
* [[Укладка графа с планарными компонентами реберной двусвязности]]&lt;br /&gt;
* [[Укладка графа с планарными компонентами вершинной двусвязности]]&lt;br /&gt;
* [[Теорема Понтрягина-Куратовского]]&lt;br /&gt;
* [[Двойственный граф планарного графа]]&lt;br /&gt;
&lt;br /&gt;
== Раскраски графов ==&lt;br /&gt;
* [[Раскраска графа]]&lt;br /&gt;
* [[Двудольные графы и раскраска в 2 цвета]]&lt;br /&gt;
* [[Хроматический многочлен]]&lt;br /&gt;
** [[Хроматический многочлен#Хроматический многочлен полного графа|Хроматический многочлен полного графа]]&lt;br /&gt;
** [[Хроматический многочлен#Хроматический многочлен пустого графа|Хроматический многочлен пустого графа]]&lt;br /&gt;
** [[Хроматический многочлен#Хроматический многочлен дерева|Хроматический многочлен дерева]]&lt;br /&gt;
** [[Хроматический многочлен#Рекуррентные формулы для хроматических многочленов|Рекуррентные формулы для хроматических многочленов]]&lt;br /&gt;
** [[Хроматический многочлен#Коэффициенты хроматического многочлена|Коэффициенты хроматического многочлена: старший, второй коэффициенты, знакопеременность]]&lt;br /&gt;
* [[Формула Зыкова]]&lt;br /&gt;
* [[Формула Уитни]]&lt;br /&gt;
&lt;br /&gt;
== Обход в глубину ==&lt;br /&gt;
* [[Обход в глубину, цвета вершин]]&lt;br /&gt;
* [[Лемма о белых путях]]&lt;br /&gt;
* [[Использование обхода в глубину для проверки связности]]&lt;br /&gt;
* [[Использование обхода в глубину для поиска цикла в ориентированном графе]]&lt;br /&gt;
* [[Использование обхода в глубину для топологической сортировки]]&lt;br /&gt;
* [[Использование обхода в глубину для поиска компонент сильной связности]]&lt;br /&gt;
* [[Использование обхода в глубину для поиска точек сочленения]]&lt;br /&gt;
* [[Построение компонент вершинной двусвязности]]&lt;br /&gt;
* [[Использование обхода в глубину для поиска мостов]]&lt;br /&gt;
* [[Построение компонент реберной двусвязности]]&lt;br /&gt;
&lt;br /&gt;
== Кратчайшие пути в графах ==&lt;br /&gt;
* [[Обход в ширину]]&lt;br /&gt;
* [[Алгоритм Форда-Беллмана]]&lt;br /&gt;
* [[Алгоритм Дейкстры]]&lt;br /&gt;
* [[Алгоритм Флойда]]&lt;br /&gt;
* [[Алгоритм A*]]&lt;br /&gt;
* [[Алгоритм Джонсона]]&lt;br /&gt;
&lt;br /&gt;
== Остовные деревья ==&lt;br /&gt;
* [[Лемма о безопасном ребре]]&lt;br /&gt;
* [[Алгоритм Прима]]&lt;br /&gt;
* [[Алгоритм Краскала]]&lt;br /&gt;
* [[Критерий Тарьяна минимальности остовного дерева|Теорема Тарьяна (критерий минимальности остовного дерева)]]&lt;br /&gt;
* [[Алгоритм двух китайцев]]&lt;br /&gt;
&lt;br /&gt;
== Задача о паросочетании ==&lt;br /&gt;
* [[Теорема о максимальном паросочетании и дополняющих цепях]]&lt;br /&gt;
* [[Алгоритм Форда-Фалкерсона для поиска максимального паросочетания]]&lt;br /&gt;
* [[Алгоритм Куна для поиска максимального паросочетания]]&lt;br /&gt;
* [[Связь максимального паросочетания и минимального вершинного покрытия в двудольных графах]]&lt;br /&gt;
* [[Связь вершинного покрытия и независимого множества]]&lt;br /&gt;
* [[Матрица Татта и связь с размером максимального паросочетания в двудольном графе]]&lt;br /&gt;
* [[Алгоритм вырезания соцветий|Паросочетания в недвудольных графах. Алгоритм вырезания соцветий]]&lt;br /&gt;
&lt;br /&gt;
== Задача о максимальном потоке ==&lt;br /&gt;
* [[Определение сети, потока]]&lt;br /&gt;
* [[Разрез, лемма о потоке через разрез]]&lt;br /&gt;
* [[Дополняющая сеть, дополняющий путь]]&lt;br /&gt;
* [[Лемма о сложении потоков]]&lt;br /&gt;
* [[Теорема Форда-Фалкерсона]]&lt;br /&gt;
* [[Алгоритм Форда-Фалкерсона, реализация с помощью поиска в глубину]]&lt;br /&gt;
* [[Алоритм Эдмондса-Карпа]]&lt;br /&gt;
* [[Теорема о декомпозиции]]&lt;br /&gt;
* [[Теорема о декомпозиционном барьере]]&lt;br /&gt;
* [[Блокирующий поток]]&lt;br /&gt;
* [[Схема алгоритма Диница]]&lt;br /&gt;
* [[Циркуляция потока]]&lt;br /&gt;
* [[Алгоритм поиска блокирующего потока в ациклической сети]]&lt;br /&gt;
* [[Алгоритм масштабирования потока]]&lt;br /&gt;
* [[Теоремы Карзанова о числе итераций алгоритма Диница в сети с целочисленными пропускными способностями]]&lt;br /&gt;
&lt;br /&gt;
== Задача о потоке минимальной стоимости ==&lt;br /&gt;
* [[Поток минимальной стоимости]]&lt;br /&gt;
* [[Теорема Форда-Фалкерсона о потоке минимальной стоимости]]&lt;br /&gt;
* [[Лемма об эквивалентности свойства потока быть минимальной стоимости и отсутствии отрицательных циклов в остаточной сети]]&lt;br /&gt;
* [[Поиск потока минимальной стоимости методом дополнения вдоль путей минимальной стоимости]]&lt;br /&gt;
* [[Использование потенциалов Джонсона при поиске потока минимальной стоимости]]&lt;br /&gt;
* [[Сведение задачи о назначениях к задаче о потоке минимальной стоимости]]&lt;br /&gt;
* [[Венгерский алгоритм решения задачи о назначениях]]&lt;br /&gt;
&lt;br /&gt;
= Четвертый семестр =&lt;br /&gt;
&lt;br /&gt;
== Основные определения. Простые комбинаторные свойства слов ==&lt;br /&gt;
* [[Основные определения, связанные со строками]]&lt;br /&gt;
* [[Период и бордер, их связь]]&lt;br /&gt;
* [[Слово Фибоначчи]]&lt;br /&gt;
* [[Слово Туэ-Морса]]&lt;br /&gt;
&lt;br /&gt;
== Поиск подстроки в строке ==&lt;br /&gt;
* [[Наивный алгоритм поиска подстроки в строке]]&lt;br /&gt;
* [[Поиск подстроки в строке с использованием хеширования. Алгоритм Рабина-Карпа]]&lt;br /&gt;
* [[Поиск наибольшей общей подстроки двух строк с использованием хеширования]]&lt;br /&gt;
* [[Префикс-функция]]&lt;br /&gt;
* [[Алгоритм Кнута-Морриса-Пратта]]&lt;br /&gt;
* [[Z-функция]]&lt;br /&gt;
* [[Автомат для поиска образца в тексте]]&lt;br /&gt;
* [[Бор]]&lt;br /&gt;
* [[Алгоритм Ахо-Корасик]]&lt;br /&gt;
&lt;br /&gt;
== Словарные структуры данных ==&lt;br /&gt;
* [[Суффиксный бор]]&lt;br /&gt;
* [[Сжатое суффиксное дерево]]&lt;br /&gt;
* [[Алгоритм Укконена]]&lt;br /&gt;
&lt;br /&gt;
=== Суффиксный массив ===&lt;br /&gt;
* [[Суффиксный массив]]&lt;br /&gt;
* [[Построение суффиксного массива с помощью стандартных методов сортировки]]&lt;br /&gt;
* [[Алгоритм цифровой сортировки]]&lt;br /&gt;
* [[Алгоритм цифровой сортировки суффиксов циклической строки]]&lt;br /&gt;
* [[Алгоритм Касаи и др.]]&lt;br /&gt;
* [[Алгоритм Карккайнена-Сандерса]]&lt;br /&gt;
* [[Алгоритм поиска подстроки в строке с помощью суффиксного массива]]&lt;br /&gt;
&lt;br /&gt;
== Задача о наименьшем общем предке ==&lt;br /&gt;
* [[Метод двоичного подъема]]&lt;br /&gt;
* [[Сведение задачи LCA к задаче RMQ]]&lt;br /&gt;
* [[Решение RMQ с помощью разреженной таблицы]]&lt;br /&gt;
* [[Алгоритм Фарака-Колтона и Бендера]] (решение +/-1 RMQ с помощью метода четверых русских)&lt;br /&gt;
* [[Сведение задачи RMQ к задаче LCA]]&lt;br /&gt;
&lt;br /&gt;
== Матроиды ==&lt;br /&gt;
* [[Определение матроида]]&lt;br /&gt;
* [[Примеры матроидов]]&lt;br /&gt;
* [[Прямая сумма матроидов]]&lt;br /&gt;
* [[Теорема Радо-Эдмондса (жадный алгоритм)]]&lt;br /&gt;
* [[Жадный алгоритм поиска базы минимального веса]]&lt;br /&gt;
* [[Теорема о базах]]&lt;br /&gt;
* [[Аксиоматизация матроида базами]]&lt;br /&gt;
* [[Теорема о циклах]]&lt;br /&gt;
* [[Аксиоматизация матроида циклами]]&lt;br /&gt;
* [[Ранговая функция, полумодулярность]]&lt;br /&gt;
* [[Двойственный матроид]]&lt;br /&gt;
* [[Оператор замыкания для матроидов]]&lt;br /&gt;
* [[Пересечение матроидов, определение, примеры]]&lt;br /&gt;
* [[Лемма о паросочетании в графе замен]]&lt;br /&gt;
* [[Лемма о единственном паросочетании в графе замен]]&lt;br /&gt;
* [[Граф замен для двух матроидов]]&lt;br /&gt;
* [[Лемма о единственном паросочетании в подграфе замен, индуцированном кратчайшим путем]]&lt;br /&gt;
* [[Алгоритм построения базы в пересечении матроидов]]&lt;br /&gt;
* [[Теорема Эдмондса-Лоулера]]&lt;br /&gt;
* [[Объединение матроидов, проверка множества на независимость]]&lt;br /&gt;
* [[Объединение матроидов, доказательство того, что объединение является матроидом]]&lt;br /&gt;
* [[Алгоритм построения базы в объединении матроидов]]&lt;br /&gt;
==Теория расписаний==&lt;br /&gt;
* [[Классификация задач]]&lt;br /&gt;
* [[Методы решения задач теории расписаний]]&lt;br /&gt;
* [[Правило Лаулера]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22276</id>
		<title>Сортировка выбором</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22276"/>
				<updated>2012-05-13T12:22:27Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Сортировка выбором''' (англ. '''selection sort''') - это простой алгоритм сортировки со сложностью &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; - количество элементов для сортировки. Сортировка выбором предназначена для решения задачи сортировки (sorting problem).&lt;br /&gt;
&lt;br /&gt;
== Задача сортировки ==&lt;br /&gt;
'''На входе''' последовательность из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; чисел (&amp;lt;tex&amp;gt;x_1, x_2, ..., x_n&amp;lt;/tex&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
'''На выходе''' перестановка данной последовательности (&amp;lt;tex&amp;gt;{x_1}^{'}, {x_2}^{'}, ..., {x_n}^{'}&amp;lt;/tex&amp;gt;) таким образом, что для ее членов выполняется &amp;lt;tex&amp;gt;{x_1}^{'} \le {x_2}^{'} \le ... \le {x_n}^{'}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
&lt;br /&gt;
Шаг 1. Выбираем минимальный элемент из текущего массива.&lt;br /&gt;
&lt;br /&gt;
Шаг 2. Ставим его на первое место.&lt;br /&gt;
&lt;br /&gt;
Шаг 3. Новый массив начинается со следующего элемента. Перейти к шагу 1, если массив не пустой.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  // Входной массив x, содержащий n элементов.&lt;br /&gt;
  for (i = 0 to n - 1)&lt;br /&gt;
     int min = i;&lt;br /&gt;
        for (j = i + 1 to n - 1)&lt;br /&gt;
           if (x[j] &amp;lt; x[min])&lt;br /&gt;
              min = j;&lt;br /&gt;
     swap(x[i], x[min]);&lt;br /&gt;
  // Массив x отсортирован&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Krotser&amp;diff=22274</id>
		<title>Участник:Krotser</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Krotser&amp;diff=22274"/>
				<updated>2012-05-13T12:03:29Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сергей Кротов, группа 1537&lt;br /&gt;
&lt;br /&gt;
*[[Неравенство Макмиллана]]&lt;br /&gt;
&lt;br /&gt;
*[[Задача коммивояжера, ДП по подмножествам]]&lt;br /&gt;
&lt;br /&gt;
*[[Сортировка выбором]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22263</id>
		<title>Сортировка выбором</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D0%BC&amp;diff=22263"/>
				<updated>2012-05-13T11:36:50Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: Новая страница: «== Редактирование ==»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Редактирование ==&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D0%B2%D0%BE%D1%8F%D0%B6%D0%B5%D1%80%D0%B0,_%D0%94%D0%9F_%D0%BF%D0%BE_%D0%BF%D0%BE%D0%B4%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B0%D0%BC&amp;diff=16725</id>
		<title>Задача коммивояжера, ДП по подмножествам</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D0%B2%D0%BE%D1%8F%D0%B6%D0%B5%D1%80%D0%B0,_%D0%94%D0%9F_%D0%BF%D0%BE_%D0%BF%D0%BE%D0%B4%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B0%D0%BC&amp;diff=16725"/>
				<updated>2012-01-14T23:19:45Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: /* Динамическое программирование по подмножествам (по маскам) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Задача о коммивояжере''' (англ. '''Travelling - salesman problem, TSP''') - это задача, в которой коммивояжер должен посетить &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt; городов, побывав в каждом из них ровно по одному разу и завершив путешествие в том городе, с которого он начал. В какой последовательности ему нужно обходить города, чтобы общая длина его пути была наименьшей?&lt;br /&gt;
&lt;br /&gt;
== Варианты решения  ==&lt;br /&gt;
В теории алгоритмов NP-полная (NPC, NP-complete) задача — задача из класса NP, к которой можно свести любую другую задачу из класса NP за полиномиальное время. Таким образом, NP-полные задачи образуют в некотором смысле подмножество «самых сложных» задач в классе NP; и если для какой-то из них будет найден «быстрый» алгоритм решения, то и любая другая задача из класса NP может быть решена так же «быстро». Cтатус NP-полных задач пока что неизвестен. Для их решения до настоящего времени не разработано алгоритмов с полиномиальным временем работы, но и не доказано, что для какой-то из них алгоритмов не существует. Этот так называемый вопрос P&amp;lt;tex&amp;gt;\neq&amp;lt;/tex&amp;gt;NP с момента своей постановки в 1971 году стал одним из самых трудных в теории вычислительных систем.&lt;br /&gt;
&lt;br /&gt;
Так вот задача о коммивояжере относится к классу NP-полных задач. Поэтому, рассмотрим два варианта решения с экспоненциальным временем работы.&lt;br /&gt;
&lt;br /&gt;
==== Перебор перестановок ====&lt;br /&gt;
Можно решить задачу перебором всевозможных перестановок. Для этого нужно сгенерировать все &amp;lt;tex&amp;gt; N! &amp;lt;/tex&amp;gt; всевозможных перестановок вершин исходного графа, подсчитать для каждой перестановки длину маршрута и выбрать минимальный из них. Но тогда задача оказывается неосуществимой даже для достаточно небольших &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;. Сложность алгоритма  &amp;lt;tex&amp;gt;O({N!}\times{N})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Динамическое программирование по подмножествам (по маскам) ====&lt;br /&gt;
&lt;br /&gt;
Задача о коммивояжере представляет собой поиск кратчайшего гамильтонова цикла в графе.&lt;br /&gt;
&lt;br /&gt;
Смоделируем данную задачу при помощи графа. При этом вершинам будут соответствовать города, а ребрам - дороги. Пусть в графе &amp;lt;tex&amp;gt; G=(V,E)&amp;lt;/tex&amp;gt;   &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt;&lt;br /&gt;
вершин, пронумерованных от &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;N-1&amp;lt;/tex&amp;gt; и каждое ребро &amp;lt;tex&amp;gt;(i, j) \in E &amp;lt;/tex&amp;gt; имеет некоторый вес &amp;lt;tex&amp;gt; w(i,j)&amp;lt;/tex&amp;gt;. Необходимо найти гамильтонов цикл, сумма весов по ребрам которого минимальна.&lt;br /&gt;
&lt;br /&gt;
Зафиксируем начальную вершину &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и будем искать гамильтонов цикл наименьшей стоимости - путь от &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;, проходящий по всем вершинам (кроме первоначальной) один раз. Т.к. искомый цикл проходит через каждую вершину, то выбор &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; не имеет значения. Поэтому будем считать &amp;lt;tex&amp;gt;s = 0 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подмножества вершин будем кодировать битовыми векторами, обозначим &amp;lt;tex&amp;gt;mask_i&amp;lt;/tex&amp;gt; значение &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ого бита в векторе &amp;lt;tex&amp;gt;mask&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;tex&amp;gt;d[i][mask]&amp;lt;/tex&amp;gt; как наименьшую стоимость пути из вершины &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в вершину &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;, проходящую (не считая вершины &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;) единожды по всем тем и только тем вершинам &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;, для которых &amp;lt;tex&amp;gt;mask_j = 1&amp;lt;/tex&amp;gt; (т.е. &amp;lt;tex&amp;gt;d[i][mask]&amp;lt;/tex&amp;gt; уже  найденный оптимальный путь от &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой вершины до &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;-ой, проходящий через те вершины, где &amp;lt;tex&amp;gt;mask_j=1&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;mask_j=0&amp;lt;/tex&amp;gt;,то эти вершины еще не посещены).&lt;br /&gt;
&lt;br /&gt;
*Начальное состояние - когда находимся в 0-й вершине, ни одна вершина не посещена, а пройденный путь равен &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; (т.е. &amp;lt;tex&amp;gt;i = 0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;mask = 0&amp;lt;/tex&amp;gt;). &lt;br /&gt;
*Для остальных состояний (&amp;lt;tex&amp;gt;i \ne 0&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;mask \ne 0&amp;lt;/tex&amp;gt;) перебираем все возможные переходы в &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ую вершину из любой посещенной ранее и выбираем минимальный результат.&lt;br /&gt;
*Если возможные переходы отсутствуют, решения для данной подзадачи не существует (обозначим ответ для такой подзадачи как &amp;lt;tex&amp;gt;\infty&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Стоимостью минимального гамильтонова цикла в исходном графе будет значение &amp;lt;tex&amp;gt; d[0][2^n-1]&amp;lt;/tex&amp;gt; - стоимость пути из &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;-й вершины в &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;-ю, при необходимости посетить все вершины. Данное решение требует &amp;lt;tex&amp;gt;O({2^n}\times{n})&amp;lt;/tex&amp;gt; памяти и &amp;lt;tex&amp;gt;O({2^n}\times{n^2})&amp;lt;/tex&amp;gt; времени.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы восстановить сам путь, воспользуемся соотношением &amp;lt;tex&amp;gt; d[i][mask] = w(i, j) + d[j][mask - 2^j] &amp;lt;/tex&amp;gt;,  которое выполняется для всех ребер, входящих в минимальный цикл . Начнем с состояния &amp;lt;tex&amp;gt; i = 0 &amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; mask = 2^n - 1&amp;lt;/tex&amp;gt;, найдем вершину &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;, для которой выполняется указанное соотношение, добавим &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; в ответ, пересчитаем текущее состояние как &amp;lt;tex&amp;gt;i = j&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; mask = mask - 2^j &amp;lt;/tex&amp;gt;. Процесс заканчивается в состоянии &amp;lt;tex&amp;gt;i = 0&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; mask = 0 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  //Все переменные используются из описания алгоритма, inf = бесконечность&lt;br /&gt;
  d[0][0] = 0;&lt;br /&gt;
  for i = 0 to n - 1&lt;br /&gt;
    for mask = 0 to mask = 2 ** n - 1&lt;br /&gt;
      for j = 0 to n - 1&lt;br /&gt;
        if j-ий бит mask == 1&lt;br /&gt;
          if w(i, j) существует&lt;br /&gt;
            d[i][mask] = min(d[i][mask], d[j][mask - 2 ** n] + w(i, j);&lt;br /&gt;
          else&lt;br /&gt;
            d[i][mask] = inf;&lt;br /&gt;
  print d[0][2 ** n - 1];&lt;br /&gt;
&lt;br /&gt;
== Ссылки == &lt;br /&gt;
*[http://ru.wikipedia.org/wiki/Задача_коммивояжёра Задача коммивояжера в русской википедии]&lt;br /&gt;
&lt;br /&gt;
*[http://de.wikipedia.org/wiki/Problem_des_Handlungsreisenden Задача коммивояжера в немецкой википедии]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*''Романовский И. В.'' Дискретный анализ. СПб.: Невский Диалект; БХВ-Петербург, 2003. ISBN 5-7940-0114-3&lt;br /&gt;
&lt;br /&gt;
*''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом &amp;quot;Вильямс&amp;quot;, 2005. ISBN 5-8459-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Динамическое программирование]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D0%B2%D0%BE%D1%8F%D0%B6%D0%B5%D1%80%D0%B0,_%D0%94%D0%9F_%D0%BF%D0%BE_%D0%BF%D0%BE%D0%B4%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B0%D0%BC&amp;diff=16445</id>
		<title>Задача коммивояжера, ДП по подмножествам</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D0%B2%D0%BE%D1%8F%D0%B6%D0%B5%D1%80%D0%B0,_%D0%94%D0%9F_%D0%BF%D0%BE_%D0%BF%D0%BE%D0%B4%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B0%D0%BC&amp;diff=16445"/>
				<updated>2012-01-13T01:41:10Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Задача о коммивояжере''' (англ. '''Travelling - salesman problem, TSP''') - это задача, в которой коммивояжер должен посетить &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt; городов, побывав в каждом из них ровно по одному разу и завершив путешествие в том городе, с которого он начал. В какой последовательности ему нужно обходить города, чтобы общая длина его пути была наименьшей?&lt;br /&gt;
&lt;br /&gt;
== Варианты решения  ==&lt;br /&gt;
В теории алгоритмов NP-полная (NPC, NP-complete) задача — задача из класса NP, к которой можно свести любую другую задачу из класса NP за полиномиальное время. Таким образом, NP-полные задачи образуют в некотором смысле подмножество «самых сложных» задач в классе NP; и если для какой-то из них будет найден «быстрый» алгоритм решения, то и любая другая задача из класса NP может быть решена так же «быстро». Cтатус NP-полных задач пока что неизвестен. Для их решения до настоящего времени не разработано алгоритмов с полиномиальным временем работы, но и не доказано, что для какой-то из них алгоритмов не существует. Этот так называемый вопрос P&amp;lt;tex&amp;gt;\neq&amp;lt;/tex&amp;gt;NP с момента своей постановки в 1971 году стал одним из самых трудных в теории вычислительных систем.&lt;br /&gt;
&lt;br /&gt;
Так вот задача о коммивояжере относится к классу NP-полных задач. Поэтому, рассмотрим два варианта решения с экспоненциальным временем работы.&lt;br /&gt;
&lt;br /&gt;
==== Перебор перестановок ====&lt;br /&gt;
Можно решить задачу перебором всевозможных перестановок. Для этого нужно сгенерировать все &amp;lt;tex&amp;gt; N! &amp;lt;/tex&amp;gt; всевозможных перестановок вершин исходного графа, подсчитать для каждой перестановки длину маршрута и выбрать минимальный из них. Но тогда задача оказывается неосуществимой даже для достаточно небольших &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;. Сложность алгоритма  &amp;lt;tex&amp;gt;O({N!}\times{N})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Динамическое программирование по подмножествам (по маскам) ====&lt;br /&gt;
&lt;br /&gt;
Задача о коммивояжере представляет собой поиск кратчайшего гамильтонова цикла в графе.&lt;br /&gt;
&lt;br /&gt;
Смоделируем данную задачу при помощи графа. При этом вершинам будут соответствовать города, а ребрам - дороги. Пусть в графе &amp;lt;tex&amp;gt; G=(V,E)&amp;lt;/tex&amp;gt;   &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt;&lt;br /&gt;
вершин, пронумерованных от &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;N-1&amp;lt;/tex&amp;gt; и каждое ребро &amp;lt;tex&amp;gt;(i, j) \in E &amp;lt;/tex&amp;gt; имеет некоторый вес &amp;lt;tex&amp;gt; w(i,j)&amp;lt;/tex&amp;gt;. Необходимо найти гамильтонов цикл, сумма весов по ребрам которого минимальна.&lt;br /&gt;
&lt;br /&gt;
Зафиксируем начальную вершину &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и будем искать гамильтонов цикл наименьшей стоимости - путь от &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;, проходящий по всем вершинам (кроме первоначальной) один раз. Т.к. искомый цикл проходит через каждую вершину, то выбор &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; не имеет значения. Поэтому будем считать &amp;lt;tex&amp;gt;s = 0 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подмножества вершин будем кодировать битовыми векторами, обозначим &amp;lt;tex&amp;gt;mask_i&amp;lt;/tex&amp;gt; значение &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ого бита в векторе &amp;lt;tex&amp;gt;mask&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;tex&amp;gt;d[i][mask]&amp;lt;/tex&amp;gt; как наименьшую стоимость пути из вершины &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в вершину &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;, проходящую (не считая вершины &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;) единожды по всем тем и только тем вершинам &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;, для которых &amp;lt;tex&amp;gt;mask_j = 1&amp;lt;/tex&amp;gt; (т.е. &amp;lt;tex&amp;gt;d[i][mask]&amp;lt;/tex&amp;gt; уже  найденный оптимальный путь от &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой вершины до &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;-ой, проходящий через те вершины, где &amp;lt;tex&amp;gt;mask_j=1&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;mask_j=0&amp;lt;/tex&amp;gt;,то эти вершины еще не посещены).&lt;br /&gt;
&lt;br /&gt;
Начальное состояние - когда находимся в 0-й вершине, ни одна вершина не посещена, а пройденный путь равен &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; (т.е. &amp;lt;tex&amp;gt;i = 0&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;mask = 0&amp;lt;/tex&amp;gt;). Для остальных состояний перебираем все возможные переходы в &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ую вершину из любой посещенной ранее и выбираем минимальный результат. Если возможные переходы отсутствуют, решения для данной подзадачи не существует (обозначим ответ для такой подзадачи как &amp;lt;tex&amp;gt;\infty&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
То есть, &amp;lt;tex&amp;gt;d[i][mask]&amp;lt;/tex&amp;gt; считается по следующему правилу:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; d[i][mask] =&lt;br /&gt;
\begin{cases}&lt;br /&gt;
 0, &amp;amp;\text{if }i = 0\text{ and }mask = 0 \\&lt;br /&gt;
 \min\limits_{j:\text{ }mask_j=1,\text{ }(i, j) \in E} \begin{Bmatrix} w(i, j) + d[j][mask - 2^j] \end{Bmatrix}, &amp;amp; \text{if } i\neq 0 \text{ or } mask \neq 0\\&lt;br /&gt;
 \infty, &amp;amp; \text{if } i \neq 0 \text{ and } mask \neq 0 \text{ and } j:\text{ }mask_j=1,\text{ }(i, j) \notin E&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Стоимостью минимального гамильтонова цикла в исходном графе будет значение &amp;lt;tex&amp;gt; d[0][2^n-1]&amp;lt;/tex&amp;gt; - стоимость пути из &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;-й вершины в &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;-ю, при необходимости посетить все вершины. Данное решение требует &amp;lt;tex&amp;gt;O({2^n}\times{n})&amp;lt;/tex&amp;gt; памяти и &amp;lt;tex&amp;gt;O({2^n}\times{n^2})&amp;lt;/tex&amp;gt; времени.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы восстановить сам путь, воспользуемся соотношением &amp;lt;tex&amp;gt; d[i][mask] = w(i, j) + d[j][mask - 2^j] &amp;lt;/tex&amp;gt;,  которое выполняется для всех ребер, входящих в минимальный цикл . Начнем с состояния &amp;lt;tex&amp;gt; i = 0 &amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; mask = 2^n - 1&amp;lt;/tex&amp;gt;, найдем вершину &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;, для которой выполняется указанное соотношение, добавим &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; в ответ, пересчитаем текущее состояние как &amp;lt;tex&amp;gt;i = j&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; mask = mask - 2^j &amp;lt;/tex&amp;gt;. Процесс заканчивается в состоянии &amp;lt;tex&amp;gt;i = 0&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; mask = 0 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  //Все переменные используются из описания алгоритма, inf = бесконечность&lt;br /&gt;
  d[0][0] = 0;&lt;br /&gt;
  for i = 0 to n - 1&lt;br /&gt;
    for mask = 0 to mask = 2 ** n - 1&lt;br /&gt;
      for j = 0 to n - 1&lt;br /&gt;
        if j-ий бит mask == 1&lt;br /&gt;
          if w(i, j) существует&lt;br /&gt;
            d[i][mask] = min(d[i][mask], d[j][mask - 2 ** n] + w(i, j);&lt;br /&gt;
          else&lt;br /&gt;
            d[i][mask] = inf;&lt;br /&gt;
  print d[0][2 ** n - 1];&lt;br /&gt;
&lt;br /&gt;
== Ссылки == &lt;br /&gt;
*[http://ru.wikipedia.org/wiki/Задача_коммивояжёра Задача коммивояжера в русской википедии]&lt;br /&gt;
&lt;br /&gt;
*[http://de.wikipedia.org/wiki/Problem_des_Handlungsreisenden Задача коммивояжера в немецкой википедии]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*''Романовский И. В.'' Дискретный анализ. СПб.: Невский Диалект; БХВ-Петербург, 2003. ISBN 5-7940-0114-3&lt;br /&gt;
&lt;br /&gt;
*''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом &amp;quot;Вильямс&amp;quot;, 2005. ISBN 5-8459-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Динамическое программирование]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D1%80%D0%B0%D0%B2%D0%B5%D0%BD%D1%81%D1%82%D0%B2%D0%BE_%D0%9C%D0%B0%D0%BA%D0%BC%D0%B8%D0%BB%D0%BB%D0%B0%D0%BD%D0%B0&amp;diff=16438</id>
		<title>Неравенство Макмиллана</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D1%80%D0%B0%D0%B2%D0%B5%D0%BD%D1%81%D1%82%D0%B2%D0%BE_%D0%9C%D0%B0%D0%BA%D0%BC%D0%B8%D0%BB%D0%BB%D0%B0%D0%BD%D0%B0&amp;diff=16438"/>
				<updated>2012-01-13T01:27:17Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Необходимые определения ==&lt;br /&gt;
{{Определение &lt;br /&gt;
|definition=&lt;br /&gt;
Пусть заданы два произвольных конечных множества, которые называются, соответственно, '''кодируемым алфавитом''' и '''кодирующим алфавитом'''. Их элементы называются '''символами''', а строки (последовательности конечной длины) символов — '''словами'''. Длина слова — это число символов, из которого оно состоит.}}&lt;br /&gt;
В качестве кодирующего алфавита часто рассматривается множество &amp;lt;tex&amp;gt;\{0, 1\}&amp;lt;/tex&amp;gt; — так называемый двоичный или бинарный алфавит.&lt;br /&gt;
&lt;br /&gt;
{{Определение &lt;br /&gt;
|definition=&lt;br /&gt;
'''Кодом''' для алфавита &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; называется функция &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, которая для каждого символа &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; указывает слово &amp;lt;tex&amp;gt;C(x)&amp;lt;/tex&amp;gt;, кодирующее этот символ.}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Код называется '''однозначным''', если никаким двум словам кодируемого алфавита не может быть сопоставлен один и тот же код.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Неравенство Макмиллана ==&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
 &amp;lt;tex&amp;gt; \sum\limits_{i = 1}^{|A|} 2^{-l_i} \le 1&amp;lt;/tex&amp;gt; (где &amp;lt;tex&amp;gt;l_i&amp;lt;/tex&amp;gt; {{---}} длины кодовых слов) выполняется для любого однозначно декодируемого кода.&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем теорему способом, приведенным в книге А. Шеня &amp;quot;Программирование: теоремы и задачи&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Пусть имеется однозначный код с &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; кодовыми словами &amp;lt;tex&amp;gt;P_1, ..., P_k&amp;lt;/tex&amp;gt;. Необходимо доказать, что их длины &amp;lt;tex&amp;gt;n_i=|P_i|&amp;lt;/tex&amp;gt; удовлетворяют неравенству Макмиллана.&lt;br /&gt;
&lt;br /&gt;
Для удобства при кодировании вместо нулей и единиц будем использовать &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Представим сумму всех слов (кодируемых через &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;) и возведем эту сумму в степень &amp;lt;tex&amp;gt;N \in \mathbb N&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;(P_1+P_2+...P_k)^N&amp;lt;/tex&amp;gt;. Раскроем скобки, подразумевая под умножением конкатенацию двух слов. По определению однозначности никакое слово не может быть получено двумя способами при соединении кодовых слов, следовательно все слова должны получиться разными.&lt;br /&gt;
&lt;br /&gt;
Вот пример для однозначного кода со словами &amp;lt;tex&amp;gt;a,ab,bb&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;N=2&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&amp;lt;tex&amp;gt;(a+ab+bb)^2&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt;=(a+ab+bb)\times{(a+ab+bb)}=aa+aab+abb+aba+abab+abbb+bba+bbab+bbbb.&amp;lt;/tex&amp;gt; Все получившиеся слагаемые различны (соответствует определению однозначности).&lt;br /&gt;
&lt;br /&gt;
Подставим &amp;lt;tex&amp;gt;a=b=\frac{1}{2}&amp;lt;/tex&amp;gt; в неравенство. Для кодового слова &amp;lt;tex&amp;gt;P_i&amp;lt;/tex&amp;gt; длины &amp;lt;tex&amp;gt;{n_i}&amp;lt;/tex&amp;gt; получим &amp;lt;tex&amp;gt;2^{-n_i}&amp;lt;/tex&amp;gt;. В левой части получится выражение из неравенства Макмиллана: &amp;lt;tex&amp;gt;(2^{-n_1}+2^{-n_2}+...+2^{-n_k})^N&amp;lt;/tex&amp;gt;. Всего имеется не более &amp;lt;tex&amp;gt;2^l&amp;lt;/tex&amp;gt; слагаемых длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; равных &amp;lt;tex&amp;gt;2^{-l}&amp;lt;/tex&amp;gt;, следовательно слагаемые данной длины в сумме не превосходят единицы, а правая часть не превосходит максимальной длины слагаемых: &amp;lt;tex&amp;gt;N\times{\max(n_i)}&amp;lt;/tex&amp;gt;. Получаем, что &amp;lt;tex&amp;gt;(2^{-n_1}+2^{-n_2}+...+2^{-n_k})^N \le N\times{\max(n_i)}&amp;lt;/tex&amp;gt; верно для любого &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;. Так как показательная функция растет быстрее линейной, то при основании (сумма &amp;lt;tex&amp;gt;2^{-n_i}&amp;lt;/tex&amp;gt;) большем единицы неравенство нарушается. Поэтому, для однозначного кода выполняется неравенство Макмиллана.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
*[[Неравенство Крафта]]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
''Шень А. Х.'' Программирование: теоремы и задачи. {{---}} М.: МЦНМО, 2011. С. 206 - 210. ISBN 978-5-94057-696-9&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Алгоритмы сжатия]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D1%80%D0%B0%D0%B2%D0%B5%D0%BD%D1%81%D1%82%D0%B2%D0%BE_%D0%9C%D0%B0%D0%BA%D0%BC%D0%B8%D0%BB%D0%BB%D0%B0%D0%BD%D0%B0&amp;diff=16434</id>
		<title>Неравенство Макмиллана</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D1%80%D0%B0%D0%B2%D0%B5%D0%BD%D1%81%D1%82%D0%B2%D0%BE_%D0%9C%D0%B0%D0%BA%D0%BC%D0%B8%D0%BB%D0%BB%D0%B0%D0%BD%D0%B0&amp;diff=16434"/>
				<updated>2012-01-13T01:12:21Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: /* Неравенство Макмиллана */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Необходимые определения ==&lt;br /&gt;
{{Определение &lt;br /&gt;
|definition=&lt;br /&gt;
Пусть заданы два произвольных конечных множества, которые называются, соответственно, '''кодируемым алфавитом''' и '''кодирующим алфавитом'''. Их элементы называются '''символами''', а строки (последовательности конечной длины) символов — '''словами'''. Длина слова — это число символов, из которого оно состоит.}}&lt;br /&gt;
В качестве кодирующего алфавита часто рассматривается множество &amp;lt;tex&amp;gt;\{0, 1\}&amp;lt;/tex&amp;gt; — так называемый двоичный или бинарный алфавит.&lt;br /&gt;
&lt;br /&gt;
{{Определение &lt;br /&gt;
|definition=&lt;br /&gt;
'''Кодом''' для алфавита &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; называется функция &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, которая для каждого символа &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; указывает слово &amp;lt;tex&amp;gt;C(x)&amp;lt;/tex&amp;gt;, кодирующее этот символ.}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Код называется '''однозначным''', если никаким двум словам кодируемого алфавита не может быть сопоставлен один и тот же код.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Неравенство Макмиллана ==&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
 &amp;lt;tex&amp;gt; \sum\limits_{i = 1}^{|A|} 2^{-l_i} \le 1&amp;lt;/tex&amp;gt; (где &amp;lt;tex&amp;gt;l_i&amp;lt;/tex&amp;gt; {{---}} длины кодовых слов) выполняется для любого однозначно декодируемого кода.&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем теорему способом, приведенным в книге А. Шеня &amp;quot;Программирование: теоремы и задачи&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Пусть имеется однозначный код с &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; кодовыми словами &amp;lt;tex&amp;gt;P_1, ..., P_k&amp;lt;/tex&amp;gt;. Необходимо доказать, что их длины &amp;lt;tex&amp;gt;n_i=|P_i|&amp;lt;/tex&amp;gt; удовлетворяют неравенству Макмиллана.&lt;br /&gt;
&lt;br /&gt;
Для удобства при кодировании вместо нулей и единиц будем использовать &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Представим сумму всех слов (кодируемых через &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;) и возведем эту сумму в степень &amp;lt;tex&amp;gt;N \in \mathbb N&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;(P_1+P_2+...P_k)^N&amp;lt;/tex&amp;gt;. Раскроем скобки, подразумевая под умножением конкатенацию двух слов. По определению однозначности никакое слово не может быть получено двумя способами при соединении кодовых слов, следовательно все слова должны получиться разными.&lt;br /&gt;
&lt;br /&gt;
Вот пример для однозначного кода со словами &amp;lt;tex&amp;gt;a,ab,bb&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;N=2&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&amp;lt;tex&amp;gt;(a+ab+bb)^2&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt;=(a+ab+bb)\times{(a+ab+bb)}=aa+aab+abb+aba+abab+abbb+bba+bbab+bbbb.&amp;lt;/tex&amp;gt; Все получившиеся слагаемые различны (соответствует определению однозначности).&lt;br /&gt;
&lt;br /&gt;
Подставим &amp;lt;tex&amp;gt;a=b=\frac{1}{2}&amp;lt;/tex&amp;gt; в неравенство. Для кодового слова &amp;lt;tex&amp;gt;P_i&amp;lt;/tex&amp;gt; длины &amp;lt;tex&amp;gt;{n_i}&amp;lt;/tex&amp;gt; получим &amp;lt;tex&amp;gt;2^{-n_i}&amp;lt;/tex&amp;gt;. В левой части получится выражение из неравенства Макмиллана: &amp;lt;tex&amp;gt;(2^{-n_1}+2^{-n_2}+...+2^{-n_k})^N&amp;lt;/tex&amp;gt;. Всего имеется не более &amp;lt;tex&amp;gt;2^l&amp;lt;/tex&amp;gt; слагаемых длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; равных &amp;lt;tex&amp;gt;2^{-l}&amp;lt;/tex&amp;gt;, следовательно слагаемые данной длины в сумме не превосходят единицы, а правая часть не превосходит максимальной длины слагаемых: &amp;lt;tex&amp;gt;N\times{\max(n_i)}&amp;lt;/tex&amp;gt;. Получаем, что &amp;lt;tex&amp;gt;(2^{-n_1}+2^{-n_2}+...+2^{-n_k})^N \le N\times{\max(n_i)}&amp;lt;/tex&amp;gt; верно для любого &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;. Так как показательная функция растет быстрее линейной, то при основании большем единицы неравенство нарушается. Поэтому, для однозначного кода выполняется неравенство Макмиллана.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
*[[Неравенство Крафта]]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
''Шень А. Х.'' Программирование: теоремы и задачи. {{---}} М.: МЦНМО, 2011. С. 206 - 210. ISBN 978-5-94057-696-9&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Алгоритмы сжатия]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D1%80%D0%B0%D0%B2%D0%B5%D0%BD%D1%81%D1%82%D0%B2%D0%BE_%D0%9C%D0%B0%D0%BA%D0%BC%D0%B8%D0%BB%D0%BB%D0%B0%D0%BD%D0%B0&amp;diff=16426</id>
		<title>Неравенство Макмиллана</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D1%80%D0%B0%D0%B2%D0%B5%D0%BD%D1%81%D1%82%D0%B2%D0%BE_%D0%9C%D0%B0%D0%BA%D0%BC%D0%B8%D0%BB%D0%BB%D0%B0%D0%BD%D0%B0&amp;diff=16426"/>
				<updated>2012-01-13T00:28:53Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Необходимые определения ==&lt;br /&gt;
{{Определение &lt;br /&gt;
|definition=&lt;br /&gt;
Пусть заданы два произвольных конечных множества, которые называются, соответственно, '''кодируемым алфавитом''' и '''кодирующим алфавитом'''. Их элементы называются '''символами''', а строки (последовательности конечной длины) символов — '''словами'''. Длина слова — это число символов, из которого оно состоит.}}&lt;br /&gt;
В качестве кодирующего алфавита часто рассматривается множество &amp;lt;tex&amp;gt;\{0, 1\}&amp;lt;/tex&amp;gt; — так называемый двоичный или бинарный алфавит.&lt;br /&gt;
&lt;br /&gt;
{{Определение &lt;br /&gt;
|definition=&lt;br /&gt;
'''Кодом''' для алфавита &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; называется функция &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, которая для каждого символа &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; указывает слово &amp;lt;tex&amp;gt;C(x)&amp;lt;/tex&amp;gt;, кодирующее этот символ.}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Код называется '''однозначным''', если никаким двум словам кодируемого алфавита не может быть сопоставлен один и тот же код.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Неравенство Макмиллана ==&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
 &amp;lt;tex&amp;gt; \sum\limits_{i = 1}^{|A|} 2^{-l_i} \le 1&amp;lt;/tex&amp;gt; (где &amp;lt;tex&amp;gt;l_i&amp;lt;/tex&amp;gt; {{---}} длины кодовых слов) выполняется для любого однозначно декодируемого кода.&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем теорему способом, приведенным в книге А. Шеня &amp;quot;Программирование: теоремы и задачи&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Пусть имеется однозначный код с &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; кодовыми словами &amp;lt;tex&amp;gt;P_1, ..., P_k&amp;lt;/tex&amp;gt;. Необходимо доказать, что их длины &amp;lt;tex&amp;gt;n_i=|P_i|&amp;lt;/tex&amp;gt; удовлетворяют неравенству Макмиллана.&lt;br /&gt;
&lt;br /&gt;
Для удобства при кодировании вместо нулей и единиц будем использовать &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; соответственно.&lt;br /&gt;
&lt;br /&gt;
Представим сумму всех слов (кодируемых через &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;) и возведем эту сумму в степень &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; (любое натуральное число): &amp;lt;tex&amp;gt;(P_1+P_2+...P_k)^N&amp;lt;/tex&amp;gt;. Раскроем скобки, подразумевая под умножением конкатенацию двух слов. По определению однозначности никакое слово не может быть получено двумя способами при соединении кодовых слов, следовательно все слова должны получиться разными.&lt;br /&gt;
&lt;br /&gt;
Вот пример для однозначного кода со словами &amp;lt;tex&amp;gt;a,ab,bb&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;N=2&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&amp;lt;tex&amp;gt;(a+ab+bb)^2&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt;=(a+ab+bb)\times{(a+ab+bb)}=aa+aab+abb+aba+abab+abbb+bba+bbab+bbbb.&amp;lt;/tex&amp;gt; Все получившиеся слагаемые (слова) различны (соответствует определению однозначности).&lt;br /&gt;
&lt;br /&gt;
Подставим &amp;lt;tex&amp;gt;a=b=\frac{1}{2}&amp;lt;/tex&amp;gt; в неравенство. Для кодового слова &amp;lt;tex&amp;gt;P_i&amp;lt;/tex&amp;gt; длины &amp;lt;tex&amp;gt;{n_i}&amp;lt;/tex&amp;gt; получим &amp;lt;tex&amp;gt;2^{-n_i}&amp;lt;/tex&amp;gt;. В левой части получится выражение из неравенства Макмиллана: &amp;lt;tex&amp;gt;(2^{-n_1}+2^{-n_2}+...+2^{-n_k})^N&amp;lt;/tex&amp;gt;. Всего имеется не более &amp;lt;tex&amp;gt;2^l&amp;lt;/tex&amp;gt; слагаемых длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; равных &amp;lt;tex&amp;gt;2^{-l}&amp;lt;/tex&amp;gt;, следовательно слагаемые данной длины в сумме не превосходят единицы, а правая часть не превосходит максимальной длины слагаемых: &amp;lt;tex&amp;gt;N\times{\max(n_i)}&amp;lt;/tex&amp;gt;. Получаем, что &amp;lt;tex&amp;gt;(2^{-n_1}+2^{-n_2}+...+2^{-n_k})^N \le N\times{\max(n_i)}&amp;lt;/tex&amp;gt; верно для любого &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;. Так как показательная функция растет быстрее линейной, то при основании большем единицы неравенство нарушается. Поэтому, для однозначного кода выполняется неравенство Макмиллана.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
*[[Неравенство Крафта]]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
''Шень А. Х.'' Программирование: теоремы и задачи. {{---}} М.: МЦНМО, 2011. С. 206 - 210. ISBN 978-5-94057-696-9&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Алгоритмы сжатия]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D1%80%D0%B0%D0%B2%D0%B5%D0%BD%D1%81%D1%82%D0%B2%D0%BE_%D0%9C%D0%B0%D0%BA%D0%BC%D0%B8%D0%BB%D0%BB%D0%B0%D0%BD%D0%B0&amp;diff=14576</id>
		<title>Неравенство Макмиллана</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D1%80%D0%B0%D0%B2%D0%B5%D0%BD%D1%81%D1%82%D0%B2%D0%BE_%D0%9C%D0%B0%D0%BA%D0%BC%D0%B8%D0%BB%D0%BB%D0%B0%D0%BD%D0%B0&amp;diff=14576"/>
				<updated>2011-12-15T04:11:12Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: /* Ссылки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Необходимые определения ==&lt;br /&gt;
{{Определение &lt;br /&gt;
|definition=&lt;br /&gt;
Пусть заданы два произвольных конечных множества, которые называются, соответственно, '''кодируемым алфавитом''' и '''кодирующим алфавитом'''. Их элементы называются '''символами''', а строки (последовательности конечной длины) символов — '''словами'''. Длина слова — это число символов, из которого оно состоит.}}&lt;br /&gt;
В качестве кодирующего алфавита часто рассматривается множество &amp;lt;tex&amp;gt;\{0, 1\}&amp;lt;/tex&amp;gt; — так называемый двоичный или бинарный алфавит.&lt;br /&gt;
&lt;br /&gt;
{{Определение &lt;br /&gt;
|definition=&lt;br /&gt;
'''Кодом''' для алфавита &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; называется функция &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, которая для каждого символа &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; указывает слово &amp;lt;tex&amp;gt;C(x)&amp;lt;/tex&amp;gt;, кодирующее этот символ.}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Код называется '''однозначным''', если никаким двум словам кодируемого алфавита не может быть сопоставлен один и тот же код.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Неравенство Макмиллана ==&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
 &amp;lt;tex&amp;gt; \sum\limits_{i = 1}^{|A|} 2^{-l_i} \le 1&amp;lt;/tex&amp;gt; (где &amp;lt;tex&amp;gt;l_i&amp;lt;/tex&amp;gt; {{---}} длины кодовых слов) выполняется для любого однозначно декодируемого кода.&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем теорему способом, приведенным в книге А. Шеня &amp;quot;Программирование: теоремы и задачи&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Пусть имеется однозначный код с &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; кодовыми словами &amp;lt;tex&amp;gt;P_1,P_2, ..., P_k&amp;lt;/tex&amp;gt;. Необходимо доказать, что их длины &amp;lt;tex&amp;gt;n_i=|P_i|&amp;lt;/tex&amp;gt; удовлетворяют неравенству Макмиллана.&lt;br /&gt;
&lt;br /&gt;
Так как нет разницы из чего составлять коды, то вместо нулей и единиц будем использовать &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;. Запишем формально сумму всех кодовых слов как алгебраическое выражение &amp;lt;tex&amp;gt;P_1+P_2+...P_k&amp;lt;/tex&amp;gt; (многочлен от &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;, в котором одночлены записаны как произведения переменных &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;, без возведения в степень). Теперь возведём это в степень &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; (произвольное натуральное число) и раскроем скобки, сохраняя порядок переменных (не собирая вместе одинаковые переменные) в одночленах: &amp;lt;tex&amp;gt;(P_1+P_2+...P_k)^N=&amp;lt;/tex&amp;gt; сумма одночленов.&lt;br /&gt;
&lt;br /&gt;
Например, для кода со словами &amp;lt;tex&amp;gt;0,10,11&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;a,ba,bb&amp;lt;/tex&amp;gt; и для &amp;lt;tex&amp;gt;N=2&amp;lt;/tex&amp;gt; получаем &amp;lt;tex&amp;gt;(a+ba+bb)^2&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt;=&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;=(a+ba+bb)\times{(a+ba+bb)}=aa+aba+abb+baa+baba+babb+bba+bbba+bbbb.&amp;lt;/tex&amp;gt; Не случайно в этом примере все одночлены в правой части различны (если не переставлять переменные): так будет для любого однозначно декодируемого кода, ведь по определению однозначности никакое слово не может быть получено двумя способами при соединении кодовых слов.&lt;br /&gt;
&lt;br /&gt;
Далее подставим &amp;lt;tex&amp;gt;a=b=\frac{1}{2}&amp;lt;/tex&amp;gt; в наше неравенство (если оно верно для букв, то оно верно и для любых их числовых значений). Слева получится &amp;lt;tex&amp;gt;(2^{-n_1}+2^{-n_2}+...+2^{-n_i})^N&amp;lt;/tex&amp;gt; (выражение из неравенства Макмиллана). Оценим правую часть сверху, сгруппировав слова по длинам: имеется не более &amp;lt;tex&amp;gt;2^l&amp;lt;/tex&amp;gt; слагаемых длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt;, каждое из которых равно &amp;lt;tex&amp;gt;2^{-l}&amp;lt;/tex&amp;gt;, и потому слагаемые данной длины в сумме не превосходят единицы, а правая часть не превосходит максимальной длины слагаемых, то есть &amp;lt;tex&amp;gt;N\times{\max(n_i)}&amp;lt;/tex&amp;gt;. Получаем, что &amp;lt;tex&amp;gt;(2^{-n_1}+2^{-n_2}+...+2^{-n_i})^N&amp;lt;N\times{\max(n_i)}&amp;lt;/tex&amp;gt; и это верно при любом &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;. Если основание степени в левой части больше единицы, то при больших &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; это неравенство нарушится (показательная функция растет быстрее линейной). Поэтому, для однозначного кода выполняется неравенство Макмиллана.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
*[[Неравенство Крафта]]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
''Шень А. Х.'' Программирование: теоремы и задачи. {{---}} М.: МЦНМО, 2011. С. 206 - 210. ISBN 978-5-94057-696-9&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Алгоритмы сжатия]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D1%80%D0%B0%D0%B2%D0%B5%D0%BD%D1%81%D1%82%D0%B2%D0%BE_%D0%9C%D0%B0%D0%BA%D0%BC%D0%B8%D0%BB%D0%BB%D0%B0%D0%BD%D0%B0&amp;diff=14569</id>
		<title>Неравенство Макмиллана</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D1%80%D0%B0%D0%B2%D0%B5%D0%BD%D1%81%D1%82%D0%B2%D0%BE_%D0%9C%D0%B0%D0%BA%D0%BC%D0%B8%D0%BB%D0%BB%D0%B0%D0%BD%D0%B0&amp;diff=14569"/>
				<updated>2011-12-15T03:35:22Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: /* Неравенство Макмиллана */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Необходимые определения ==&lt;br /&gt;
{{Определение &lt;br /&gt;
|definition=&lt;br /&gt;
Пусть заданы два произвольных конечных множества, которые называются, соответственно, '''кодируемым алфавитом''' и '''кодирующим алфавитом'''. Их элементы называются '''символами''', а строки (последовательности конечной длины) символов — '''словами'''. Длина слова — это число символов, из которого оно состоит.}}&lt;br /&gt;
В качестве кодирующего алфавита часто рассматривается множество &amp;lt;tex&amp;gt;\{0, 1\}&amp;lt;/tex&amp;gt; — так называемый двоичный или бинарный алфавит.&lt;br /&gt;
&lt;br /&gt;
{{Определение &lt;br /&gt;
|definition=&lt;br /&gt;
'''Кодом''' для алфавита &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; называется функция &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, которая для каждого символа &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; указывает слово &amp;lt;tex&amp;gt;C(x)&amp;lt;/tex&amp;gt;, кодирующее этот символ.}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Код называется '''однозначным''', если никаким двум словам кодируемого алфавита не может быть сопоставлен один и тот же код.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Неравенство Макмиллана ==&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
 &amp;lt;tex&amp;gt; \sum\limits_{i = 1}^{|A|} 2^{-l_i} \le 1&amp;lt;/tex&amp;gt; (где &amp;lt;tex&amp;gt;l_i&amp;lt;/tex&amp;gt; {{---}} длины кодовых слов) выполняется для любого однозначно декодируемого кода.&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем теорему способом, приведенным в книге А. Шеня &amp;quot;Программирование: теоремы и задачи&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Пусть имеется однозначный код с &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; кодовыми словами &amp;lt;tex&amp;gt;P_1,P_2, ..., P_k&amp;lt;/tex&amp;gt;. Необходимо доказать, что их длины &amp;lt;tex&amp;gt;n_i=|P_i|&amp;lt;/tex&amp;gt; удовлетворяют неравенству Макмиллана.&lt;br /&gt;
&lt;br /&gt;
Так как нет разницы из чего составлять коды, то вместо нулей и единиц будем использовать &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;. Запишем формально сумму всех кодовых слов как алгебраическое выражение &amp;lt;tex&amp;gt;P_1+P_2+...P_k&amp;lt;/tex&amp;gt; (многочлен от &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;, в котором одночлены записаны как произведения переменных &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;, без возведения в степень). Теперь возведём это в степень &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; (произвольное натуральное число) и раскроем скобки, сохраняя порядок переменных (не собирая вместе одинаковые переменные) в одночленах: &amp;lt;tex&amp;gt;(P_1+P_2+...P_k)^N=&amp;lt;/tex&amp;gt; сумма одночленов.&lt;br /&gt;
&lt;br /&gt;
Например, для кода со словами &amp;lt;tex&amp;gt;0,10,11&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;a,ba,bb&amp;lt;/tex&amp;gt; и для &amp;lt;tex&amp;gt;N=2&amp;lt;/tex&amp;gt; получаем &amp;lt;tex&amp;gt;(a+ba+bb)^2&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt;=&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;=(a+ba+bb)\times{(a+ba+bb)}=aa+aba+abb+baa+baba+babb+bba+bbba+bbbb.&amp;lt;/tex&amp;gt; Не случайно в этом примере все одночлены в правой части различны (если не переставлять переменные): так будет для любого однозначно декодируемого кода, ведь по определению однозначности никакое слово не может быть получено двумя способами при соединении кодовых слов.&lt;br /&gt;
&lt;br /&gt;
Далее подставим &amp;lt;tex&amp;gt;a=b=\frac{1}{2}&amp;lt;/tex&amp;gt; в наше неравенство (если оно верно для букв, то оно верно и для любых их числовых значений). Слева получится &amp;lt;tex&amp;gt;(2^{-n_1}+2^{-n_2}+...+2^{-n_i})^N&amp;lt;/tex&amp;gt; (выражение из неравенства Макмиллана). Оценим правую часть сверху, сгруппировав слова по длинам: имеется не более &amp;lt;tex&amp;gt;2^l&amp;lt;/tex&amp;gt; слагаемых длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt;, каждое из которых равно &amp;lt;tex&amp;gt;2^{-l}&amp;lt;/tex&amp;gt;, и потому слагаемые данной длины в сумме не превосходят единицы, а правая часть не превосходит максимальной длины слагаемых, то есть &amp;lt;tex&amp;gt;N\times{\max(n_i)}&amp;lt;/tex&amp;gt;. Получаем, что &amp;lt;tex&amp;gt;(2^{-n_1}+2^{-n_2}+...+2^{-n_i})^N&amp;lt;N\times{\max(n_i)}&amp;lt;/tex&amp;gt; и это верно при любом &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;. Если основание степени в левой части больше единицы, то при больших &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; это неравенство нарушится (показательная функция растет быстрее линейной). Поэтому, для однозначного кода выполняется неравенство Макмиллана.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
*[http://neerc.ifmo.ru/mediawiki/index.php/%D0%9D%D0%B5%D1%80%D0%B0%D0%B2%D0%B5%D0%BD%D1%81%D1%82%D0%B2%D0%BE_%D0%9A%D1%80%D0%B0%D1%84%D1%82%D0%B0 Неравенство Крафта]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
''Шень А. Х.'' Программирование: теоремы и задачи. {{---}} М.: МЦНМО, 2011. С. 206 - 210. ISBN 978-5-94057-696-9&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Алгоритмы сжатия]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D1%80%D0%B0%D0%B2%D0%B5%D0%BD%D1%81%D1%82%D0%B2%D0%BE_%D0%9C%D0%B0%D0%BA%D0%BC%D0%B8%D0%BB%D0%BB%D0%B0%D0%BD%D0%B0&amp;diff=14568</id>
		<title>Неравенство Макмиллана</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D1%80%D0%B0%D0%B2%D0%B5%D0%BD%D1%81%D1%82%D0%B2%D0%BE_%D0%9C%D0%B0%D0%BA%D0%BC%D0%B8%D0%BB%D0%BB%D0%B0%D0%BD%D0%B0&amp;diff=14568"/>
				<updated>2011-12-15T03:33:57Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: /* Неравенство Макмиллана */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Необходимые определения ==&lt;br /&gt;
{{Определение &lt;br /&gt;
|definition=&lt;br /&gt;
Пусть заданы два произвольных конечных множества, которые называются, соответственно, '''кодируемым алфавитом''' и '''кодирующим алфавитом'''. Их элементы называются '''символами''', а строки (последовательности конечной длины) символов — '''словами'''. Длина слова — это число символов, из которого оно состоит.}}&lt;br /&gt;
В качестве кодирующего алфавита часто рассматривается множество &amp;lt;tex&amp;gt;\{0, 1\}&amp;lt;/tex&amp;gt; — так называемый двоичный или бинарный алфавит.&lt;br /&gt;
&lt;br /&gt;
{{Определение &lt;br /&gt;
|definition=&lt;br /&gt;
'''Кодом''' для алфавита &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; называется функция &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, которая для каждого символа &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; указывает слово &amp;lt;tex&amp;gt;C(x)&amp;lt;/tex&amp;gt;, кодирующее этот символ.}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Код называется '''однозначным''', если никаким двум словам кодируемого алфавита не может быть сопоставлен один и тот же код.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Неравенство Макмиллана ==&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
 &amp;lt;tex&amp;gt; \sum\limits_{i = 1}^{|A|} 2^{-l_i} \le 1&amp;lt;/tex&amp;gt; (где &amp;lt;tex&amp;gt;l_i&amp;lt;/tex&amp;gt; {{---}} длины кодовых слов) выполняется для любого однозначно декодируемого кода.&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем теорему способом, приведенным в книге А. Шеня &amp;quot;Программирование: теоремы и задачи&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Пусть имеется однозначный код с &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; кодовыми словами &amp;lt;tex&amp;gt;P_1,P_2, ..., P_k&amp;lt;/tex&amp;gt;. Необходимо доказать, что их длины &amp;lt;tex&amp;gt;n_i=|P_i|&amp;lt;/tex&amp;gt; удовлетворяют неравенству Макмиллана.&lt;br /&gt;
&lt;br /&gt;
Так как нет разницы из чего составлять коды, то вместо нулей и единиц будем использовать &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;. Запишем формально сумму всех кодовых слов как алгебраическое выражение &amp;lt;tex&amp;gt;P_1+P_2+...P_k&amp;lt;/tex&amp;gt; (многочлен от &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;, в котором одночлены записаны как произведения переменных &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;, без возведения в степень). Теперь возведём это в степень &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; (произвольное натуральное число) и раскроем скобки, сохраняя порядок переменных (не собирая вместе одинаковые переменные) в одночленах: &amp;lt;tex&amp;gt;(P_1+P_2+...P_k)^N=&amp;lt;/tex&amp;gt; сумма одночленов.&lt;br /&gt;
&lt;br /&gt;
Например, для кода со словами &amp;lt;tex&amp;gt;0,10,11&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;a,ba,bb&amp;lt;/tex&amp;gt; и для &amp;lt;tex&amp;gt;N=2&amp;lt;/tex&amp;gt; получаем &amp;lt;tex&amp;gt;(a+ba+bb)^2&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt;=&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;=(a+ba+bb)\times{(a+ba+bb)}=aa+aba+abb+baa+baba+babb+bba+bbba+bbbb.&amp;lt;/tex&amp;gt; Не случайно в этом примере все одночлены в правой части различны (если не переставлять переменные): так будет для любого однозначно декодируемого кода, ведь по определению однозначности никакое слово не может быть получено двумя способами при соединении кодовых слов.&lt;br /&gt;
&lt;br /&gt;
Далее подставим &amp;lt;tex&amp;gt;a=b=\frac{1}{2}&amp;lt;/tex&amp;gt; в наше неравенство (если оно верно для букв, то оно верно и для любых их числовых значений). Слева получится &amp;lt;tex&amp;gt;(2^{-n_1}+2^{-n_2}+...+2^{-n_i})^N&amp;lt;/tex&amp;gt; (выражение из неравенства Крафта{{---}}Макмиллана). Оценим правую часть сверху, сгруппировав слова по длинам: имеется не более &amp;lt;tex&amp;gt;2^l&amp;lt;/tex&amp;gt; слагаемых длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt;, каждое из которых равно &amp;lt;tex&amp;gt;2^{-l}&amp;lt;/tex&amp;gt;, и потому слагаемые данной длины в сумме не превосходят единицы, а правая часть не превосходит максимальной длины слагаемых, то есть &amp;lt;tex&amp;gt;N\times{\max(n_i)}&amp;lt;/tex&amp;gt;. Получаем, что &amp;lt;tex&amp;gt;(2^{-n_1}+2^{-n_2}+...+2^{-n_i})^N&amp;lt;N\times{\max(n_i)}&amp;lt;/tex&amp;gt; и это верно при любом &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;. Если основание степени в левой части больше единицы, то при больших &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; это неравенство нарушится (показательная функция растет быстрее линейной). Поэтому, для однозначного кода выполняется неравенство Крафта{{---}}Макмиллана.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
*[http://neerc.ifmo.ru/mediawiki/index.php/%D0%9D%D0%B5%D1%80%D0%B0%D0%B2%D0%B5%D0%BD%D1%81%D1%82%D0%B2%D0%BE_%D0%9A%D1%80%D0%B0%D1%84%D1%82%D0%B0 Неравенство Крафта]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
''Шень А. Х.'' Программирование: теоремы и задачи. {{---}} М.: МЦНМО, 2011. С. 206 - 210. ISBN 978-5-94057-696-9&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Алгоритмы сжатия]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D1%80%D0%B0%D0%B2%D0%B5%D0%BD%D1%81%D1%82%D0%B2%D0%BE_%D0%9C%D0%B0%D0%BA%D0%BC%D0%B8%D0%BB%D0%BB%D0%B0%D0%BD%D0%B0&amp;diff=14563</id>
		<title>Неравенство Макмиллана</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D1%80%D0%B0%D0%B2%D0%B5%D0%BD%D1%81%D1%82%D0%B2%D0%BE_%D0%9C%D0%B0%D0%BA%D0%BC%D0%B8%D0%BB%D0%BB%D0%B0%D0%BD%D0%B0&amp;diff=14563"/>
				<updated>2011-12-15T03:01:09Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: /* Неравенство Макмиллана */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Необходимые определения ==&lt;br /&gt;
{{Определение &lt;br /&gt;
|definition=&lt;br /&gt;
Пусть заданы два произвольных конечных множества, которые называются, соответственно, '''кодируемым алфавитом''' и '''кодирующим алфавитом'''. Их элементы называются '''символами''', а строки (последовательности конечной длины) символов — '''словами'''. Длина слова — это число символов, из которого оно состоит.}}&lt;br /&gt;
В качестве кодирующего алфавита часто рассматривается множество &amp;lt;tex&amp;gt;\{0, 1\}&amp;lt;/tex&amp;gt; — так называемый двоичный или бинарный алфавит.&lt;br /&gt;
&lt;br /&gt;
{{Определение &lt;br /&gt;
|definition=&lt;br /&gt;
'''Кодом''' для алфавита &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; называется функция &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, которая для каждого символа &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; указывает слово &amp;lt;tex&amp;gt;C(x)&amp;lt;/tex&amp;gt;, кодирующее этот символ.}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Код называется '''однозначным''', если никаким двум словам кодируемого алфавита не может быть сопоставлен один и тот же код.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Неравенство Макмиллана ==&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
 &amp;lt;tex&amp;gt; \sum\limits_{i = 1}^{|A|} 2^{-l_i} \le 1&amp;lt;/tex&amp;gt; (где &amp;lt;tex&amp;gt;l_i&amp;lt;/tex&amp;gt; {{---}} длины кодовых слов) выполняется для любого однозначно декодируемого кода.&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем теорему способом, приведенным в книге А. Шеня.&lt;br /&gt;
&lt;br /&gt;
Пусть имеется однозначный код с &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; кодовыми словами &amp;lt;tex&amp;gt;P_1,P_2, ..., P_k&amp;lt;/tex&amp;gt;. Необходимо доказать, что их длины &amp;lt;tex&amp;gt;n_i=|P_i|&amp;lt;/tex&amp;gt; удовлетворяют неравенству Крафта{{---}}Макмиллана.&lt;br /&gt;
&lt;br /&gt;
Так как нет разницы из чего составлять коды, то вместо нулей и единиц будем использовать &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;. Запишем формально сумму всех кодовых слов как алгебраическое выражение &amp;lt;tex&amp;gt;P_1+P_2+...P_k&amp;lt;/tex&amp;gt; (многочлен от &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;, в котором одночлены записаны как произведения переменных &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;, без возведения в степень). Теперь возведём это в степень &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; (произвольное натуральное число) и раскроем скобки, сохраняя порядок переменных (не собирая вместе одинаковые переменные) в одночленах: &amp;lt;tex&amp;gt;(P_1+P_2+...P_k)^N=&amp;lt;/tex&amp;gt; сумма одночленов.&lt;br /&gt;
&lt;br /&gt;
Например, для кода со словами &amp;lt;tex&amp;gt;0,10,11&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;a,ba,bb&amp;lt;/tex&amp;gt; и для &amp;lt;tex&amp;gt;N=2&amp;lt;/tex&amp;gt; получаем &amp;lt;tex&amp;gt;(a+ba+bb)^2&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt;=&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;=(a+ba+bb)\times{(a+ba+bb)}=aa+aba+abb+baa+baba+babb+bba+bbba+bbbb.&amp;lt;/tex&amp;gt; Не случайно в этом примере все одночлены в правой части различны (если не переставлять переменные): так будет для любого однозначно декодируемого кода, ведь по определению однозначности никакое слово не может быть получено двумя способами при соединении кодовых слов.&lt;br /&gt;
&lt;br /&gt;
Далее подставим &amp;lt;tex&amp;gt;a=b=\frac{1}{2}&amp;lt;/tex&amp;gt; в наше неравенство (если оно верно для букв, то оно верно и для любых их числовых значений). Слева получится &amp;lt;tex&amp;gt;(2^{-n_1}+2^{-n_2}+...+2^{-n_i})^N&amp;lt;/tex&amp;gt; (выражение из неравенства Крафта{{---}}Макмиллана). Оценим правую часть сверху, сгруппировав слова по длинам: имеется не более &amp;lt;tex&amp;gt;2^l&amp;lt;/tex&amp;gt; слагаемых длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt;, каждое из которых равно &amp;lt;tex&amp;gt;2^{-l}&amp;lt;/tex&amp;gt;, и потому слагаемые данной длины в сумме не превосходят единицы, а правая часть не превосходит максимальной длины слагаемых, то есть &amp;lt;tex&amp;gt;N\times{\max(n_i)}&amp;lt;/tex&amp;gt;. Получаем, что &amp;lt;tex&amp;gt;(2^{-n_1}+2^{-n_2}+...+2^{-n_i})^N&amp;lt;N\times{\max(n_i)}&amp;lt;/tex&amp;gt; и это верно при любом &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;. Если основание степени в левой части больше единицы, то при больших &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; это неравенство нарушится (показательная функция растет быстрее линейной). Поэтому, для однозначного кода выполняется неравенство Крафта{{---}}Макмиллана.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
*[http://neerc.ifmo.ru/mediawiki/index.php/%D0%9D%D0%B5%D1%80%D0%B0%D0%B2%D0%B5%D0%BD%D1%81%D1%82%D0%B2%D0%BE_%D0%9A%D1%80%D0%B0%D1%84%D1%82%D0%B0 Неравенство Крафта]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
''Шень А. Х.'' Программирование: теоремы и задачи. {{---}} М.: МЦНМО, 2011. С. 206 - 210. ISBN 978-5-94057-696-9&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Алгоритмы сжатия]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D1%80%D0%B0%D0%B2%D0%B5%D0%BD%D1%81%D1%82%D0%B2%D0%BE_%D0%9C%D0%B0%D0%BA%D0%BC%D0%B8%D0%BB%D0%BB%D0%B0%D0%BD%D0%B0&amp;diff=14562</id>
		<title>Неравенство Макмиллана</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D1%80%D0%B0%D0%B2%D0%B5%D0%BD%D1%81%D1%82%D0%B2%D0%BE_%D0%9C%D0%B0%D0%BA%D0%BC%D0%B8%D0%BB%D0%BB%D0%B0%D0%BD%D0%B0&amp;diff=14562"/>
				<updated>2011-12-15T02:45:31Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: /* Ссылки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Необходимые определения ==&lt;br /&gt;
{{Определение &lt;br /&gt;
|definition=&lt;br /&gt;
Пусть заданы два произвольных конечных множества, которые называются, соответственно, '''кодируемым алфавитом''' и '''кодирующим алфавитом'''. Их элементы называются '''символами''', а строки (последовательности конечной длины) символов — '''словами'''. Длина слова — это число символов, из которого оно состоит.}}&lt;br /&gt;
В качестве кодирующего алфавита часто рассматривается множество &amp;lt;tex&amp;gt;\{0, 1\}&amp;lt;/tex&amp;gt; — так называемый двоичный или бинарный алфавит.&lt;br /&gt;
&lt;br /&gt;
{{Определение &lt;br /&gt;
|definition=&lt;br /&gt;
'''Кодом''' для алфавита &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; называется функция &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, которая для каждого символа &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; указывает слово &amp;lt;tex&amp;gt;C(x)&amp;lt;/tex&amp;gt;, кодирующее этот символ.}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Код называется '''однозначным''', если никаким двум словам кодируемого алфавита не может быть сопоставлен один и тот же код.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Неравенство Макмиллана ==&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
 &amp;lt;tex&amp;gt; \sum\limits_{i = 1}^{|A|} 2^{-l_i} \le 1&amp;lt;/tex&amp;gt; (где &amp;lt;tex&amp;gt;l_i&amp;lt;/tex&amp;gt; {{---}} длины кодовых слов) выполняется для любого однозначно декодируемого кода.&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем теорему способом, приведенным А. Шенем.&lt;br /&gt;
&lt;br /&gt;
Пусть имеется однозначный код с &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; кодовыми словами &amp;lt;tex&amp;gt;P_1,P_2, ..., P_k&amp;lt;/tex&amp;gt;. Необходимо доказать, что их длины &amp;lt;tex&amp;gt;n_i=|P_i|&amp;lt;/tex&amp;gt; удовлетворяют неравенству Крафта{{---}}Макмиллана.&lt;br /&gt;
&lt;br /&gt;
Так как нет разницы из чего составлять коды, то вместо нулей и единиц будем использовать &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;. Запишем формально сумму всех кодовых слов как алгебраическое выражение &amp;lt;tex&amp;gt;P_1+P_2+...P_k&amp;lt;/tex&amp;gt; (многочлен от &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;, в котором одночлены записаны как произведения переменных &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;, без возведения в степень). Теперь (ещё более странное на первый взгляд действие) возведём это в степень &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; (произвольное натуральное число) и раскроем скобки, сохраняя порядок переменных (не собирая вместе одинаковые переменные) в одночленах: &amp;lt;tex&amp;gt;(P_1+P_2+...P_k)^N=&amp;lt;/tex&amp;gt; сумма одночленов.&lt;br /&gt;
&lt;br /&gt;
Например, для кода со словами &amp;lt;tex&amp;gt;0,10,11&amp;lt;/tex&amp;gt; (которые теперь записываются как &amp;lt;tex&amp;gt;a,ba,bb&amp;lt;/tex&amp;gt;) и для &amp;lt;tex&amp;gt;N=2&amp;lt;/tex&amp;gt; получаем &amp;lt;tex&amp;gt;(a+ba+bb)^2&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt;=&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;=(a+ba+bb)\times{(a+ba+bb)}=aa+aba+abb+baa+baba+babb+bba+bbba+bbbb.&amp;lt;/tex&amp;gt; Не случайно в этом примере все одночлены в правой части различны (если не переставлять переменные): так будет для любого однозначно декодируемого кода, ведь по определению однозначности никакое слово не может быть получено двумя способами при соединении кодовых слов.&lt;br /&gt;
&lt;br /&gt;
Далее подставим &amp;lt;tex&amp;gt;a=b=\frac{1}{2}&amp;lt;/tex&amp;gt; в наше неравенство (если оно верно для букв, то оно верно и для любых их числовых значений). Слева получится &amp;lt;tex&amp;gt;(2^{-n_1}+2^{-n_2}+...+2^{-n_i})^N&amp;lt;/tex&amp;gt; (выражение из неравенства Крафта{{---}}Макмиллана). Оценим правую часть сверху, сгруппировав слова по длинам: имеется не более &amp;lt;tex&amp;gt;2^l&amp;lt;/tex&amp;gt; слагаемых длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt;, каждое из которых равно &amp;lt;tex&amp;gt;2^{-l}&amp;lt;/tex&amp;gt;, и потому слагаемые данной длины в сумме не превосходят единицы, а правая часть не превосходит максимальной длины слагаемых, то есть &amp;lt;tex&amp;gt;N\times{\max(n_i)}&amp;lt;/tex&amp;gt;. Получаем, что &amp;lt;tex&amp;gt;(2^{-n_1}+2^{-n_2}+...+2^{-n_i})^N&amp;lt;N\times{\max(n_i)}&amp;lt;/tex&amp;gt; и это верно при любом &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;. Если основание степени в левой части больше единицы, то при больших &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; это неравенство нарушится (показательная функция растет быстрее линейной). Поэтому, для однозначного кода выполняется неравенство Крафта{{---}}Макмиллана.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
*[http://neerc.ifmo.ru/mediawiki/index.php/%D0%9D%D0%B5%D1%80%D0%B0%D0%B2%D0%B5%D0%BD%D1%81%D1%82%D0%B2%D0%BE_%D0%9A%D1%80%D0%B0%D1%84%D1%82%D0%B0 Неравенство Крафта]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
''Шень А. Х.'' Программирование: теоремы и задачи. {{---}} М.: МЦНМО, 2011. С. 206 - 210. ISBN 978-5-94057-696-9&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Алгоритмы сжатия]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D1%80%D0%B0%D0%B2%D0%B5%D0%BD%D1%81%D1%82%D0%B2%D0%BE_%D0%9C%D0%B0%D0%BA%D0%BC%D0%B8%D0%BB%D0%BB%D0%B0%D0%BD%D0%B0&amp;diff=14561</id>
		<title>Неравенство Макмиллана</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D1%80%D0%B0%D0%B2%D0%B5%D0%BD%D1%81%D1%82%D0%B2%D0%BE_%D0%9C%D0%B0%D0%BA%D0%BC%D0%B8%D0%BB%D0%BB%D0%B0%D0%BD%D0%B0&amp;diff=14561"/>
				<updated>2011-12-15T02:38:30Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: /* Неравенство Макмиллана */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Необходимые определения ==&lt;br /&gt;
{{Определение &lt;br /&gt;
|definition=&lt;br /&gt;
Пусть заданы два произвольных конечных множества, которые называются, соответственно, '''кодируемым алфавитом''' и '''кодирующим алфавитом'''. Их элементы называются '''символами''', а строки (последовательности конечной длины) символов — '''словами'''. Длина слова — это число символов, из которого оно состоит.}}&lt;br /&gt;
В качестве кодирующего алфавита часто рассматривается множество &amp;lt;tex&amp;gt;\{0, 1\}&amp;lt;/tex&amp;gt; — так называемый двоичный или бинарный алфавит.&lt;br /&gt;
&lt;br /&gt;
{{Определение &lt;br /&gt;
|definition=&lt;br /&gt;
'''Кодом''' для алфавита &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; называется функция &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, которая для каждого символа &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; указывает слово &amp;lt;tex&amp;gt;C(x)&amp;lt;/tex&amp;gt;, кодирующее этот символ.}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Код называется '''однозначным''', если никаким двум словам кодируемого алфавита не может быть сопоставлен один и тот же код.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Неравенство Макмиллана ==&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
 &amp;lt;tex&amp;gt; \sum\limits_{i = 1}^{|A|} 2^{-l_i} \le 1&amp;lt;/tex&amp;gt; (где &amp;lt;tex&amp;gt;l_i&amp;lt;/tex&amp;gt; {{---}} длины кодовых слов) выполняется для любого однозначно декодируемого кода.&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем теорему способом, приведенным А. Шенем.&lt;br /&gt;
&lt;br /&gt;
Пусть имеется однозначный код с &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; кодовыми словами &amp;lt;tex&amp;gt;P_1,P_2, ..., P_k&amp;lt;/tex&amp;gt;. Необходимо доказать, что их длины &amp;lt;tex&amp;gt;n_i=|P_i|&amp;lt;/tex&amp;gt; удовлетворяют неравенству Крафта{{---}}Макмиллана.&lt;br /&gt;
&lt;br /&gt;
Так как нет разницы из чего составлять коды, то вместо нулей и единиц будем использовать &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;. Запишем формально сумму всех кодовых слов как алгебраическое выражение &amp;lt;tex&amp;gt;P_1+P_2+...P_k&amp;lt;/tex&amp;gt; (многочлен от &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;, в котором одночлены записаны как произведения переменных &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;, без возведения в степень). Теперь (ещё более странное на первый взгляд действие) возведём это в степень &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; (произвольное натуральное число) и раскроем скобки, сохраняя порядок переменных (не собирая вместе одинаковые переменные) в одночленах: &amp;lt;tex&amp;gt;(P_1+P_2+...P_k)^N=&amp;lt;/tex&amp;gt; сумма одночленов.&lt;br /&gt;
&lt;br /&gt;
Например, для кода со словами &amp;lt;tex&amp;gt;0,10,11&amp;lt;/tex&amp;gt; (которые теперь записываются как &amp;lt;tex&amp;gt;a,ba,bb&amp;lt;/tex&amp;gt;) и для &amp;lt;tex&amp;gt;N=2&amp;lt;/tex&amp;gt; получаем &amp;lt;tex&amp;gt;(a+ba+bb)^2&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt;=&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;=(a+ba+bb)\times{(a+ba+bb)}=aa+aba+abb+baa+baba+babb+bba+bbba+bbbb.&amp;lt;/tex&amp;gt; Не случайно в этом примере все одночлены в правой части различны (если не переставлять переменные): так будет для любого однозначно декодируемого кода, ведь по определению однозначности никакое слово не может быть получено двумя способами при соединении кодовых слов.&lt;br /&gt;
&lt;br /&gt;
Далее подставим &amp;lt;tex&amp;gt;a=b=\frac{1}{2}&amp;lt;/tex&amp;gt; в наше неравенство (если оно верно для букв, то оно верно и для любых их числовых значений). Слева получится &amp;lt;tex&amp;gt;(2^{-n_1}+2^{-n_2}+...+2^{-n_i})^N&amp;lt;/tex&amp;gt; (выражение из неравенства Крафта{{---}}Макмиллана). Оценим правую часть сверху, сгруппировав слова по длинам: имеется не более &amp;lt;tex&amp;gt;2^l&amp;lt;/tex&amp;gt; слагаемых длины &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt;, каждое из которых равно &amp;lt;tex&amp;gt;2^{-l}&amp;lt;/tex&amp;gt;, и потому слагаемые данной длины в сумме не превосходят единицы, а правая часть не превосходит максимальной длины слагаемых, то есть &amp;lt;tex&amp;gt;N\times{\max(n_i)}&amp;lt;/tex&amp;gt;. Получаем, что &amp;lt;tex&amp;gt;(2^{-n_1}+2^{-n_2}+...+2^{-n_i})^N&amp;lt;N\times{\max(n_i)}&amp;lt;/tex&amp;gt; и это верно при любом &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;. Если основание степени в левой части больше единицы, то при больших &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; это неравенство нарушится (показательная функция растет быстрее линейной). Поэтому, для однозначного кода выполняется неравенство Крафта{{---}}Макмиллана.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Ссылки == &lt;br /&gt;
[[Неравенство Крафта]]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
''Шень А. Х.'' Программирование: теоремы и задачи. {{---}} М.: МЦНМО, 2011. С. 206 - 210. ISBN 978-5-94057-696-9&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Алгоритмы сжатия]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D0%B2%D0%BE%D1%8F%D0%B6%D0%B5%D1%80%D0%B0,_%D0%94%D0%9F_%D0%BF%D0%BE_%D0%BF%D0%BE%D0%B4%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B0%D0%BC&amp;diff=13770</id>
		<title>Задача коммивояжера, ДП по подмножествам</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D0%B2%D0%BE%D1%8F%D0%B6%D0%B5%D1%80%D0%B0,_%D0%94%D0%9F_%D0%BF%D0%BE_%D0%BF%D0%BE%D0%B4%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B0%D0%BC&amp;diff=13770"/>
				<updated>2011-12-01T15:27:10Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Задача о коммивояжере''' (англ. '''Travelling - salesman problem, TSP''') - это задача, в которой определяется кратчайший замкнутый путь, соединяющий заданное множество, которое состоит из &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt; точек на плоскости. Коммивояжер должен посетить &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt; городов, побывав в каждом из них ровно по одному разу и завершив путешествие в том городе, с которого он начал. В какой последовательности ему нужно обходить города, чтобы общая длина его пути была наименьшей?&lt;br /&gt;
&lt;br /&gt;
== Варианты решения  ==&lt;br /&gt;
В теории алгоритмов NP-полная (NPC, NP-complete) задача — задача из класса NP, к которой можно свести любую другую задачу из класса NP за полиномиальное время. Таким образом, NP-полные задачи образуют в некотором смысле подмножество «самых сложных» задач в классе NP; и если для какой-то из них будет найден «быстрый» алгоритм решения, то и любая другая задача из класса NP может быть решена так же «быстро». Cтатус NP-полных задач пока что неизвестен. Для их решения до настоящего времени не разработано алгоритмов с полиномиальным временем работы, но и не доказано, что для какой-то из них алгоритмов не существует. Этот так называемый вопрос P&amp;lt;tex&amp;gt;\neq&amp;lt;/tex&amp;gt;NP с момента своей постановки в 1971 году стал одним из самых трудных в теории вычислительных систем.&lt;br /&gt;
&lt;br /&gt;
Так вот задача о коммивояжере относится к классу NP-полных задач. Рассмотрим два варианта решения.&lt;br /&gt;
&lt;br /&gt;
==== Перебор перестановок ====&lt;br /&gt;
Можно решить задачу перебором всевозможных перестановок. Для этого нужно сгенерировать все &amp;lt;tex&amp;gt; N! &amp;lt;/tex&amp;gt; всевозможных перестановок вершин исходного графа, подсчитать для каждой перестановки длину маршрута и выбрать минимальный из них. Но тогда задача оказывается неосуществимой даже для достаточно небольших &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;. Сложность алгоритма  &amp;lt;tex&amp;gt;O({N!}\times{N})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Динамическое программирование по подмножествам (по маскам) ====&lt;br /&gt;
&lt;br /&gt;
Задача о коммивояжере представляет собой поиск кратчайшего гамильтонова цикла в графе.&lt;br /&gt;
&lt;br /&gt;
Смоделируем данную задачу при помощи графа. При этом вершинам будут соответствовать города, а ребрам - дороги. Пусть в графе &amp;lt;tex&amp;gt; G=(V,E)&amp;lt;/tex&amp;gt;   &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt;&lt;br /&gt;
вершин, пронумерованных от &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;N-1&amp;lt;/tex&amp;gt; и каждое ребро &amp;lt;tex&amp;gt;(i, j) \in E &amp;lt;/tex&amp;gt; имеет некоторый вес &amp;lt;tex&amp;gt; w(i,j)&amp;lt;/tex&amp;gt;. Необходимо найти гамильтонов цикл, сумма весов по ребрам которого минимальна.&lt;br /&gt;
&lt;br /&gt;
Зафиксируем начальную вершину &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и будем искать гамильтонов цикл наименьшей стоимости - путь от &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;, проходящий по всем вершинам (кроме первоначальной) один раз. Т.к. искомый цикл проходит через каждую вершину, то выбор &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; не имеет значения. Поэтому будем считать &amp;lt;tex&amp;gt;s = 0 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подмножества вершин будем кодировать битовыми векторами, обозначим &amp;lt;tex&amp;gt;mask_i&amp;lt;/tex&amp;gt; значение &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ого бита в векторе &amp;lt;tex&amp;gt;mask&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;tex&amp;gt;d[i][mask]&amp;lt;/tex&amp;gt; как наименьшую стоимость пути из вершины &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в вершину &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;, проходящую (не считая вершины &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;) единожды по всем тем и только тем вершинам &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;, для которых &amp;lt;tex&amp;gt;mask_j = 1&amp;lt;/tex&amp;gt; (т.е. &amp;lt;tex&amp;gt;d[i][mask]&amp;lt;/tex&amp;gt; уже  найденный оптимальный путь от &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой вершины до &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;-ой, проходящий через те вершины, где &amp;lt;tex&amp;gt;mask_j=1&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;mask_j=0&amp;lt;/tex&amp;gt;,то эти вершины еще не посещены).&lt;br /&gt;
&lt;br /&gt;
Начальное состояние - когда находимся в 0-й вершине, ни одна вершина не посещена, а пройденный путь равен &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; (т.е. &amp;lt;tex&amp;gt;i = 0&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;mask = 0&amp;lt;/tex&amp;gt;). Для остальных состояний перебираем все возможные переходы в &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ую вершину из любой посещенной ранее и выбираем минимальный результат. Если возможные переходы отсутствуют, решения для данной подзадачи не существует (обозначим ответ для такой подзадачи как &amp;lt;tex&amp;gt;\infty&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
То есть, &amp;lt;tex&amp;gt;d[i][mask]&amp;lt;/tex&amp;gt; считается по следующему правилу:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; d[i][mask] =&lt;br /&gt;
\begin{cases}&lt;br /&gt;
 0, &amp;amp;\text{if }i = 0\text{ and }mask = 0 \\&lt;br /&gt;
 min_{j: mask_j=1, (i, j) \in E} \begin{Bmatrix} w(i, j) + d[j][mask - 2^j] \end{Bmatrix}, &amp;amp; \text{if } i\neq 0 \text{ or } mask \neq 0\\&lt;br /&gt;
 \infty, &amp;amp; \text{if } i \neq 0 \text{ and } mask \neq 0 \text{ and set of possible transitions is empty}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где, &amp;lt;tex&amp;gt; \text {and ---}&amp;lt;/tex&amp;gt; и, &amp;lt;tex&amp;gt;\text {or ---} &amp;lt;/tex&amp;gt; или, &amp;lt;tex&amp;gt;\text {set of possible transitions is empty ---}&amp;lt;/tex&amp;gt; множество возможных переходов пусто.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стоимостью минимального гамильтонова цикла в исходном графе будет значение &amp;lt;tex&amp;gt; d[0][2^n-1]&amp;lt;/tex&amp;gt; - стоимость пути из &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;-й вершины в &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;-ю, при необходимости посетить все вершины. Данное решение требует &amp;lt;tex&amp;gt;O({2^n}\times{n})&amp;lt;/tex&amp;gt; памяти и &amp;lt;tex&amp;gt;O({2^n}\times{n^2})&amp;lt;/tex&amp;gt; времени.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы восстановить сам путь, воспользуемся соотношением &amp;lt;tex&amp;gt; d[i][mask] = w(i, j) + d[j][mask - 2^j] &amp;lt;/tex&amp;gt;,  которое выполняется для всех ребер, входящих в минимальный цикл . Начнем с состояния &amp;lt;tex&amp;gt; i = 0 &amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; mask = 2^n - 1&amp;lt;/tex&amp;gt;, найдем вершину &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;, для которой выполняется указанное соотношение, добавим &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; в ответ, пересчитаем текущее состояние как &amp;lt;tex&amp;gt;i = j&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; mask = mask - 2^j &amp;lt;/tex&amp;gt;. Процесс заканчивается в состоянии &amp;lt;tex&amp;gt;i = 0&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; mask = 0 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  //Все переменные используются из описания алгоритма, inf = бесконечность&lt;br /&gt;
  d[0][0] = 0;&lt;br /&gt;
  for i = 0 to n - 1&lt;br /&gt;
    for mask = 0 to mask = 2 ** n - 1&lt;br /&gt;
      for j = 0 to n - 1&lt;br /&gt;
        if j-ий бит mask == 1&lt;br /&gt;
          if w(i, j) существует&lt;br /&gt;
            d[i][mask] = min(d[i][mask], d[j][mask - 2 ** n] + w(i, j);&lt;br /&gt;
          else&lt;br /&gt;
            d[i][mask] = inf;&lt;br /&gt;
  print d[0][2 ** n - 1];&lt;br /&gt;
&lt;br /&gt;
== Ссылки == &lt;br /&gt;
*[http://ru.wikipedia.org/wiki/Задача_коммивояжёра Задача коммивояжера в русской википедии]&lt;br /&gt;
&lt;br /&gt;
*[http://de.wikipedia.org/wiki/Problem_des_Handlungsreisenden Задача коммивояжера в немецкой википедии]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*''Романовский И. В.'' Дискретный анализ. СПб.: Невский Диалект; БХВ-Петербург, 2003. ISBN 5-7940-0114-3&lt;br /&gt;
&lt;br /&gt;
*''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом &amp;quot;Вильямс&amp;quot;, 2005. ISBN 5-8459-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Динамическое программирование]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D0%B2%D0%BE%D1%8F%D0%B6%D0%B5%D1%80%D0%B0,_%D0%94%D0%9F_%D0%BF%D0%BE_%D0%BF%D0%BE%D0%B4%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B0%D0%BC&amp;diff=13769</id>
		<title>Задача коммивояжера, ДП по подмножествам</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D0%B2%D0%BE%D1%8F%D0%B6%D0%B5%D1%80%D0%B0,_%D0%94%D0%9F_%D0%BF%D0%BE_%D0%BF%D0%BE%D0%B4%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B0%D0%BC&amp;diff=13769"/>
				<updated>2011-12-01T14:41:59Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Задача о коммивояжере''' (англ. '''Travelling - salesman problem, TSP''') - это задача, в которой определяется кратчайший замкнутый путь, соединяющий заданное множество, которое состоит из &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt; точек на плоскости. Коммивояжер должен посетить &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt; городов, побывав в каждом из них ровно по одному разу и завершив путешествие в том городе, с которого он начал. В какой последовательности ему нужно обходить города, чтобы общая длина его пути была наименьшей?&lt;br /&gt;
&lt;br /&gt;
== Варианты решения  ==&lt;br /&gt;
В теории алгоритмов NP-полная (NPC, NP-complete) задача — задача из класса NP, к которой можно свести любую другую задачу из класса NP за полиномиальное время. Таким образом, NP-полные задачи образуют в некотором смысле подмножество «самых сложных» задач в классе NP; и если для какой-то из них будет найден «быстрый» алгоритм решения, то и любая другая задача из класса NP может быть решена так же «быстро». Cтатус NP-полных задач пока что неизвестен. Для их решения до настоящего времени не разработано алгоритмов с полиномиальным временем работы, но и не доказано, что для какой-то из них алгоритмов не существует. Этот так называемый вопрос P&amp;lt;tex&amp;gt;\neq&amp;lt;/tex&amp;gt;NP с момента своей постановки в 1971 году стал одним из самых трудных в теории вычислительных систем.&lt;br /&gt;
&lt;br /&gt;
Так вот задача о коммивояжере относится к классу NP-полных задач. Рассмотрим два варианта решения.&lt;br /&gt;
&lt;br /&gt;
==== Перебор перестановок ====&lt;br /&gt;
Можно решить задачу перебором всевозможных перестановок. Для этого нужно сгенерировать все &amp;lt;tex&amp;gt; N! &amp;lt;/tex&amp;gt; всевозможных перестановок вершин исходного графа, подсчитать для каждой перестановки длину маршрута и выбрать минимальный из них. Но тогда задача оказывается неосуществимой даже для достаточно небольших &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;. Сложность алгоритма  &amp;lt;tex&amp;gt;O({N!}\times{N})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Динамическое программирование по подмножествам (по маскам) ====&lt;br /&gt;
&lt;br /&gt;
Задача о коммивояжере представляет собой поиск кратчайшего гамильтонова цикла в графе.&lt;br /&gt;
&lt;br /&gt;
Смоделируем данную задачу при помощи графа. При этом вершинам будут соответствовать города, а ребрам - дороги. Пусть в графе &amp;lt;tex&amp;gt; G?=?(V,?E)&amp;lt;/tex&amp;gt;   &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt;&lt;br /&gt;
вершин, пронумерованных от &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;N-1&amp;lt;/tex&amp;gt; и каждое ребро &amp;lt;tex&amp;gt;(i, j) \in E &amp;lt;/tex&amp;gt; имеет некоторый вес &amp;lt;tex&amp;gt; w(i,j)&amp;lt;/tex&amp;gt;. Необходимо найти гамильтонов цикл, сумма весов по ребрам которого минимальна.&lt;br /&gt;
&lt;br /&gt;
Зафиксируем начальную вершину &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и будем искать гамильтонов цикл наименьшей стоимости - путь от &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;, проходящий по всем вершинам(кроме первоначальной) один раз. Т.к. искомый цикл проходит через каждую вершину, то выбор &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; не имеет значения. Поэтому будем считать &amp;lt;tex&amp;gt;s = 0 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подмножества вершин будем кодировать битовыми векторами, обозначим &amp;lt;tex&amp;gt;mask_i&amp;lt;/tex&amp;gt; значение &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ого бита в векторе &amp;lt;tex&amp;gt;mask&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;tex&amp;gt;d[i][mask]&amp;lt;/tex&amp;gt; как наименьшую стоимость пути из вершины &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в вершину &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;, проходящую (не считая вершины &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;) единожды по всем тем и только тем вершинам &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;, для которых &amp;lt;tex&amp;gt;mask_j = 1&amp;lt;/tex&amp;gt; (т.е. &amp;lt;tex&amp;gt;mask&amp;lt;/tex&amp;gt; - подмножество вершин исходного графа, которые осталось посетить).&lt;br /&gt;
&lt;br /&gt;
Конечное состояние - когда находимся в 0-й вершине, все вершины посещены (т.е. &amp;lt;tex&amp;gt;i = 0&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;mask = 0&amp;lt;/tex&amp;gt;). Для остальных состояний перебираем все возможные переходы из &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й вершины в одну из непосещенных ранее и выбираем способ, дающий минимальный результат. Если возможные переходы отсутствуют, решения для данной подзадачи не существует (обозначим ответ для такой подзадачи как &amp;lt;tex&amp;gt;\infty&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
То есть, &amp;lt;tex&amp;gt;d[i][mask]&amp;lt;/tex&amp;gt; считается по следующему правилу:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; d[i][mask] =&lt;br /&gt;
\begin{cases}&lt;br /&gt;
 0, &amp;amp;\text{if }i = 0\text{ and }mask = 0 \\&lt;br /&gt;
 min_{j: mask_j=1, (i, j) \in E} \begin{Bmatrix} w(i, j) + d[j][mask - 2^j] \end{Bmatrix}, &amp;amp; \text{if } i\neq 0 \text{ or } mask \neq 0\\&lt;br /&gt;
 \infty, &amp;amp; \text{if } i \neq 0 \text{ and } mask \neq 0 \text{ and set of possible transitions is empty}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где, &amp;lt;tex&amp;gt; \text {and ---}&amp;lt;/tex&amp;gt; и, &amp;lt;tex&amp;gt;\text {or ---} &amp;lt;/tex&amp;gt; или, &amp;lt;tex&amp;gt;\text {set of possible transitions is empty ---}&amp;lt;/tex&amp;gt; множество возможных переходов пусто.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стоимостью минимального гамильтонова цикла в исходном графе будет значение &amp;lt;tex&amp;gt; d[0][2^n-1]&amp;lt;/tex&amp;gt; - стоимость пути из &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;-й вершины в &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;-ю, при необходимости посетить все вершины. Данное решение требует &amp;lt;tex&amp;gt;O({2^n}\times{n})&amp;lt;/tex&amp;gt; памяти и &amp;lt;tex&amp;gt;O({2^n}\times{n^2})&amp;lt;/tex&amp;gt; времени.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы восстановить сам пут, воспользуемся соотношением &amp;lt;tex&amp;gt; d[i][mask] = w(i, j) + d[j][mask - 2^j] &amp;lt;/tex&amp;gt;,  которое выполняется для всех ребер, входящих в минимальный цикл . Начнем с состояния &amp;lt;tex&amp;gt; i = 0 &amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; mask = 2^n - 1&amp;lt;/tex&amp;gt;, найдем вершину &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;, для которой выполняется указанное соотношение, добавим &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; в ответ, пересчитаем текущее состояние как &amp;lt;tex&amp;gt;i = j&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; mask = mask - 2^j &amp;lt;/tex&amp;gt;. Процесс заканчивается в состоянии &amp;lt;tex&amp;gt;i = 0&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; mask = 0 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  //Все переменные используются из описания алгоритма, inf = бесконечность&lt;br /&gt;
  d[0][0] = 0;&lt;br /&gt;
  for i = 0 to n - 1&lt;br /&gt;
    for mask = 0 to mask = 2 ** n - 1&lt;br /&gt;
      for j = 0 to n - 1&lt;br /&gt;
        if j-ий бит mask == 1&lt;br /&gt;
          if w(i, j) существует&lt;br /&gt;
            d[i][mask] = min(d[i][mask], d[j][mask - 2 ** n] + w(i, j);&lt;br /&gt;
          else&lt;br /&gt;
            d[i][mask] = inf;&lt;br /&gt;
  print d[0][2 ** n - 1];&lt;br /&gt;
&lt;br /&gt;
== Ссылки == &lt;br /&gt;
*[http://ru.wikipedia.org/wiki/Задача_коммивояжёра Задача коммивояжера в русской википедии]&lt;br /&gt;
&lt;br /&gt;
*[http://de.wikipedia.org/wiki/Problem_des_Handlungsreisenden Задача коммивояжера в немецкой википедии]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*''Романовский И. В.'' Дискретный анализ. СПб.: Невский Диалект; БХВ-Петербург, 2003. ISBN 5-7940-0114-3&lt;br /&gt;
&lt;br /&gt;
*''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом &amp;quot;Вильямс&amp;quot;, 2005. ISBN 5-8459-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Динамическое программирование]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D0%B2%D0%BE%D1%8F%D0%B6%D0%B5%D1%80%D0%B0,_%D0%94%D0%9F_%D0%BF%D0%BE_%D0%BF%D0%BE%D0%B4%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B0%D0%BC&amp;diff=13753</id>
		<title>Задача коммивояжера, ДП по подмножествам</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D0%B2%D0%BE%D1%8F%D0%B6%D0%B5%D1%80%D0%B0,_%D0%94%D0%9F_%D0%BF%D0%BE_%D0%BF%D0%BE%D0%B4%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B0%D0%BC&amp;diff=13753"/>
				<updated>2011-12-01T04:51:51Z</updated>
		
		<summary type="html">&lt;p&gt;Krotser: /* Реализация */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Задача о коммивояжере''' (англ. '''Travelling - salesman problem, TSP''') - это задача, в которой определяется кратчайший замкнутый путь, соединяющий заданное множество, которое состоит из &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt; точек на плоскости.&lt;br /&gt;
&lt;br /&gt;
== Формулировка задачи ==&lt;br /&gt;
Коммивояжер должен посетить &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt; городов, побывав в каждом из них ровно по одному разу и завершив путешествие в том городе, с которого он начал. В какой последовательности ему нужно обходить города, чтобы общая длина его пути была наименьшей?&lt;br /&gt;
&lt;br /&gt;
== Варианты решения  ==&lt;br /&gt;
В теории алгоритмов NP-полная (NPC, NP-complete) задача — задача из класса NP, к которой можно свести любую другую задачу из класса NP за полиномиальное время. Таким образом, NP-полные задачи образуют в некотором смысле подмножество «самых сложных» задач в классе NP; и если для какой-то из них будет найден «быстрый» алгоритм решения, то и любая другая задача из класса NP может быть решена так же «быстро». Cтатус NP-полных задач пока что неизвестен. Для их решения до настоящего времени не разработано алгоритмов с полиномиальным временем работы, но и не доказано, что для какой-то из них алгоритмов не существует. Этот так называемый вопрос P&amp;lt;tex&amp;gt;\neq&amp;lt;/tex&amp;gt;NP с момента своей постановки в 1971 году стал одним из самых трудных в теории вычислительных систем.&lt;br /&gt;
&lt;br /&gt;
Так вот задача о коммивояжере относится к классу NP-полных задач. Рассмотрим два варианта решения.&lt;br /&gt;
==== Перебор перестановок ====&lt;br /&gt;
&lt;br /&gt;
Можно решить задачу перебором всевозможных перестановок. Для этого нужно сгенерировать все &amp;lt;tex&amp;gt; N! &amp;lt;/tex&amp;gt; всевозможных перестановок вершин исходного графа, подсчитать для каждой перестановки длину маршрута и выбрать минимальный из них. Но тогда задача оказывается неосуществимой даже для достаточно небольших &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;. Сложность алгоритма  &amp;lt;tex&amp;gt;O(N!)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Динамическое программирование по подмножествам (по маскам) ====&lt;br /&gt;
&lt;br /&gt;
Задача о коммивояжере представляет собой поиск кратчайшего гамильтонова цикла в графе.&lt;br /&gt;
&lt;br /&gt;
Смоделируем данную задачу при помощи графа. При этом вершинам будут соответствовать города, а ребрам - дороги. Пусть в графе &amp;lt;tex&amp;gt; G = (V, E)&amp;lt;/tex&amp;gt;   &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt;&lt;br /&gt;
вершин, пронумерованных от &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;N-1&amp;lt;/tex&amp;gt; и каждое ребро &amp;lt;tex&amp;gt;(i, j) \in E &amp;lt;/tex&amp;gt; имеет некоторый вес &amp;lt;tex&amp;gt; p(i, j)&amp;lt;/tex&amp;gt;. Необходимо найти гамильтонов цикл, сумма весов по ребрам которого минимальна.&lt;br /&gt;
&lt;br /&gt;
Зафиксируем начальную вершину &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; и будем искать гамильтонов цикл наименьшей стоимости - путь от &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;, проходящий по всем вершинам(кроме первоначальной) один раз. Т.к. искомый цикл проходит через каждую вершину, то выбор &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; не имеет значения. Поэтому будем считать &amp;lt;tex&amp;gt;S = 0 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подмножества вершин будем кодировать битовыми векторами, обозначим &amp;lt;tex&amp;gt;mask_i&amp;lt;/tex&amp;gt; значение &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ого бита в векторе &amp;lt;tex&amp;gt;mask&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;tex&amp;gt;d[i][mask]&amp;lt;/tex&amp;gt; как наименьшую стоимость пути из вершины &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; в вершину &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;, проходящую (не считая вершины &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;) единожды по всем тем и только тем вершинам &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;, для которых &amp;lt;tex&amp;gt;mask_j = 1&amp;lt;/tex&amp;gt; (т.е. &amp;lt;tex&amp;gt;mask&amp;lt;/tex&amp;gt; - подмножество вершин исходного графа, которые осталось посетить).&lt;br /&gt;
&lt;br /&gt;
Конечное состояние - когда находимся в 0-й вершине, все вершины посещены (т.е. &amp;lt;tex&amp;gt;i = 0&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;mask = 0&amp;lt;/tex&amp;gt;). Для остальных состояний перебираем все возможные переходы из &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-й вершины в одну из непосещенных ранее и выбираем способ, дающий минимальный результат. Если возможные переходы отсутствуют, решения для данной подзадачи не существует (обозначим ответ для такой подзадачи как &amp;lt;tex&amp;gt;\infty&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
То есть, &amp;lt;tex&amp;gt;d[i][mask]&amp;lt;/tex&amp;gt; считается по следующему правилу:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; d[i][mask] =&lt;br /&gt;
\begin{cases}&lt;br /&gt;
 0, &amp;amp;\text{if }i = 0\text{ and }mask = 0 \\&lt;br /&gt;
 min_{j: mask_j=1, (i, j) \in E} \begin{Bmatrix} p(i, j) + d[j][mask - 2^j] \end{Bmatrix}, &amp;amp; \text{if } i\neq 0 \text{ or } mask \neq 0\\&lt;br /&gt;
 \infty, &amp;amp; \text{if } i \neq 0 \text{ and } mask \neq 0 \text{ and set of possible transitions is empty}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где, &amp;lt;tex&amp;gt; \text {and ---}&amp;lt;/tex&amp;gt; и, &amp;lt;tex&amp;gt;\text {or ---} &amp;lt;/tex&amp;gt; или, &amp;lt;tex&amp;gt;\text {set of possible transitions is empty ---}&amp;lt;/tex&amp;gt; множество возможных переходов пусто.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стоимостью минимального гамильтонова цикла в исходном графе будет значение &amp;lt;tex&amp;gt; d[0][2^n-1]&amp;lt;/tex&amp;gt; - стоимость пути из &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;-й вершины в &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;-ю, при необходимости посетить все вершины.&lt;br /&gt;
&lt;br /&gt;
Восстановить сам цикл несложно. Для этого воспользуемся соотношением &amp;lt;tex&amp;gt; d[i][mask] = p(i, j) + d[j][mask - 2^j] &amp;lt;/tex&amp;gt;,  которое выполняется для всех ребер, входящих в минимальный цикл . Начнем с состояния &amp;lt;tex&amp;gt; i = 0 &amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; mask = 2^n - 1&amp;lt;/tex&amp;gt;, найдем вершину &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt;, для которой выполняется указанное соотношение, добавим &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; в ответ, пересчитаем текущее состояние как &amp;lt;tex&amp;gt;i = j&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; mask = mask - 2^j &amp;lt;/tex&amp;gt;. Процесс заканчивается в состоянии &amp;lt;tex&amp;gt;i = 0&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; mask = 0 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данное решение требует &amp;lt;tex&amp;gt;O({2^n}\times{n})&amp;lt;/tex&amp;gt; памяти и &amp;lt;tex&amp;gt;O({2^n}\times{n^2})&amp;lt;/tex&amp;gt; времени.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
  //Все переменные используются из описания алгоритма, inf = бесконечность&lt;br /&gt;
  inputData(); //считывание данных&lt;br /&gt;
  d[0][0] = 0;&lt;br /&gt;
  for i = 0 to n - 1&lt;br /&gt;
    for mask = 0 to mask = 2 ^ n - 1&lt;br /&gt;
      for j = 0 to n - 1&lt;br /&gt;
        if j-ий бит mask == 1&lt;br /&gt;
          if p(i, j) существует&lt;br /&gt;
            d[i][mask] = min(d[i][mask], d[j][mask - 2 ^ j]);&lt;br /&gt;
          else&lt;br /&gt;
            d[i][mask] = inf;&lt;br /&gt;
  writeData(); // запись данных, ответ хранится в d[0][2 ^ n - 1]&lt;br /&gt;
&lt;br /&gt;
== Ссылки == &lt;br /&gt;
*[http://ru.wikipedia.org/wiki/Задача_коммивояжёра Задача коммивояжера в русской википедии]&lt;br /&gt;
&lt;br /&gt;
*[http://de.wikipedia.org/wiki/Problem_des_Handlungsreisenden Задача коммивояжера в немецкой википедии]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
*''Романовский И. В.'' Дискретный анализ. СПб.: Невский Диалект; БХВ-Петербург, 2003. ISBN 5-7940-0114-3&lt;br /&gt;
&lt;br /&gt;
*''Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К.'' Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом &amp;quot;Вильямс&amp;quot;, 2005. ISBN 5-8459-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Динамическое программирование]]&lt;/div&gt;</summary>
		<author><name>Krotser</name></author>	</entry>

	</feed>