<?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=109.205.250.119&amp;*</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=109.205.250.119&amp;*"/>
		<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/109.205.250.119"/>
		<updated>2026-05-19T21:40:00Z</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_%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=22434</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_%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC&amp;diff=22434"/>
				<updated>2012-05-17T10:10:22Z</updated>
		
		<summary type="html">&lt;p&gt;109.205.250.119: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Описание==&lt;br /&gt;
[[Файл:Merge-sort1.gif|right|380px|thumb|Действие алгоритма.]]&lt;br /&gt;
'''Сортировка слиянием''' — алгоритм сортировки, хороший пример использования принципа «разделяй и властвуй». Он был пред­ло­жен Джо­ном фон Ней­ма­ном в 1945 го­ду.&lt;br /&gt;
&lt;br /&gt;
Это ста­биль­ный ал­го­ритм сор­ти­ров­ки, использующий &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; дополнительной памяти и &amp;lt;tex&amp;gt;O(n&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\log(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;
# Раз­бить имею­щие­ся эле­мен­ты мас­си­ва на па­ры и осу­ще­ствить слия­ние эле­мен­тов каж­дой па­ры, по­лу­чив от­сор­ти­ро­ван­ные це­поч­ки дли­ны 2 (кро­ме, быть мо­жет, од­но­го эле­мен­та, для ко­то­ро­го не на­шлось па­ры).&lt;br /&gt;
# Раз­бить имею­щие­ся от­сор­ти­ро­ван­ные це­поч­ки на па­ры, и осу­ще­ствить слия­ние це­по­чек каж­дой па­ры.&lt;br /&gt;
# Ес­ли чис­ло от­сор­ти­ро­ван­ных це­по­чек боль­ше еди­ни­цы, пе­рей­ти к ша­гу 2.&lt;br /&gt;
&lt;br /&gt;
===Слияние двух массивов===&lt;br /&gt;
Допустим, у нас есть два отсортированных массива А и B размерами &amp;lt;tex&amp;gt;N_a &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;N_b &amp;lt;/tex&amp;gt;  со­ответственно, и мы хотим объединить их элементы в один большой отсортирован­ный массив C размером &amp;lt;tex&amp;gt;N_a + N_b &amp;lt;/tex&amp;gt; . Для этого можно применить процедуру слия­ния, суть которой заключается в повторяющемся «отделении» элемента, наи­меньшего из двух имеющихся в началах исходных массивов, и присоединении это­го элемента к концу результирующего массива. Элементы мы переносим до тех пор, пока один из исходных массивов не закончится. После этого оставшийся «хвост» одного из входных массивов дописывается в конец результирующего мас­сива. Пример работы процедуры показан на рисунке:&lt;br /&gt;
[[Файл:Mergearr.png|right|300px|thumb|Пример работы процедуры слияния.]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Алгоритм слияния формально можно записать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;// слияние двух массивов с помощью временного&lt;br /&gt;
merge(array a, int left, int middle, int right) // left - левая граница, right - правая, middle - середина&lt;br /&gt;
  array b = a[middle + 1, right];&lt;br /&gt;
  i = left, j = middle + 1, k = 0;&lt;br /&gt;
  array temp;&lt;br /&gt;
  while i &amp;lt;= middle and j &amp;lt;= right&lt;br /&gt;
    temp[k++] = (a[j] &amp;lt; b[i]) ? a[j++] : b[i++];&lt;br /&gt;
  while i &amp;lt;= middle&lt;br /&gt;
    temp[k++] = b[i++];&lt;br /&gt;
  while j &amp;lt;= right&lt;br /&gt;
    temp[k++] = a[j++];&lt;br /&gt;
  for (int t = 0; t != k; t++)&lt;br /&gt;
    a[t] = temp[t]&lt;br /&gt;
// в конце a[1..k] это будет отсортированный массив&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Рекурсивный алгоритм==&lt;br /&gt;
[[Файл:Merge sort1.png|300px|right|thumb|Пример работы рекурсивного алгоритма сортировки слиянием]]&lt;br /&gt;
Проще всего формализовать этот алгоритм рекурсивным способом. Функция сортирует участок массива от элемента с номером left до элемен­та с номером right:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sort(array a, int left, int right) // right и left — правая и левая граница массива, middle — середина&lt;br /&gt;
  middle = right / 2  &lt;br /&gt;
  if middle == right    // условие выхода — если массив стал состоять из 1 элемента&lt;br /&gt;
    return&lt;br /&gt;
  sort(a, left, middle) &lt;br /&gt;
  sort (a, middle + 1, right)&lt;br /&gt;
  merge(array a, left, middle, right)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример работы алгоритма показан на рисунке:&lt;br /&gt;
&lt;br /&gt;
==Время работы==&lt;br /&gt;
Чтобы оценить время работы этого алгоритма, составим рекуррентное соотношение. Пускай &amp;lt;tex&amp;gt;T(n)&amp;lt;/tex&amp;gt; — время сортировки массива длины n, тогда для сортировки слиянием справедливо &amp;lt;tex&amp;gt;T(n)=2T(n/2)+O(n)&amp;lt;/tex&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
(&amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; — это время, необходимое на то, чтобы слить два массива). Распишем это соотношение:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T(n)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;=&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;2T(n/2)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;+&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;=&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;4T(n/4)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;+&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;2*O(n)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;=&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;...&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;=&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;2^kT(1)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;+&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;kO(n).&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Осталось оценить &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;. Мы знаем, что &amp;lt;tex&amp;gt;2^k=n&amp;lt;/tex&amp;gt;, а значит &amp;lt;tex&amp;gt;k=\log(n)&amp;lt;/tex&amp;gt;. Уравнение примет вид &amp;lt;tex&amp;gt;T(n)=nT(1)+ \log(n)O(n)&amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt;T(1)&amp;lt;/tex&amp;gt; — константа, то &amp;lt;tex&amp;gt;T(n)=O(n)+\log(n)O(n)=O(n\log(n))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
*[http://ru.wikipedia.org/wiki/Mergesort Википедия — сортировка слиянием]&lt;br /&gt;
*[http://iproc.ru/parallel-programming/lection-6/ Сортировка слиянием]&lt;br /&gt;
*[http://www.sorting-algorithms.com/merge-sort Сортировка слиянием, анимация и свойства (англ.)]&lt;br /&gt;
*[http://ru.wikibooks.org/wiki/%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8_%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC Примеры реализации на различных языках (Википедия)]&lt;br /&gt;
*[http://iproc.ru/parallel-programming/lection-6/ Сортировка слиянием в картинках (источник картинок в статье)]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Сортировки]]&lt;/div&gt;</summary>
		<author><name>109.205.250.119</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BE%D0%BD%D0%BA%D1%83%D1%80%D1%81_%D0%B4%D0%BB%D1%8F_%D0%B1%D0%BE%D0%BB%D0%B5%D0%B5_%D1%83%D0%B4%D0%B0%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_URL_%D1%81%D0%B0%D0%B9%D1%82%D0%B0_%D0%B2%D0%B8%D0%BA%D0%B8-%D0%BA%D0%BE%D0%BD%D1%81%D0%BF%D0%B5%D0%BA%D1%82%D0%BE%D0%B2&amp;diff=18095</id>
		<title>Конкурс для более удачного URL сайта вики-конспектов</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BE%D0%BD%D0%BA%D1%83%D1%80%D1%81_%D0%B4%D0%BB%D1%8F_%D0%B1%D0%BE%D0%BB%D0%B5%D0%B5_%D1%83%D0%B4%D0%B0%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_URL_%D1%81%D0%B0%D0%B9%D1%82%D0%B0_%D0%B2%D0%B8%D0%BA%D0%B8-%D0%BA%D0%BE%D0%BD%D1%81%D0%BF%D0%B5%D0%BA%D1%82%D0%BE%D0%B2&amp;diff=18095"/>
				<updated>2012-02-15T14:57:50Z</updated>
		
		<summary type="html">&lt;p&gt;109.205.250.119: /* Варианты */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Хочется избавиться от имени mediawiki, потому что это название вики-движка .&lt;br /&gt;
&lt;br /&gt;
Предлагайте варианты URL для вики-конспектов на этой странице.&lt;br /&gt;
Подписывайтесь, бонусы возможны.&lt;br /&gt;
&lt;br /&gt;
== Варианты ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Вариант!!Автор (&amp;lt;nowiki&amp;gt;~~~&amp;lt;/nowiki&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
|knowledge||[[Участник:Kirelagin|Кирилл Елагин]]&lt;br /&gt;
|-&lt;br /&gt;
|wikiconsp||[[Участник:Igor buzhinsky|Игорь Бужинский]]&lt;br /&gt;
|-&lt;br /&gt;
|wk ''(что бы это ни значило)''||[[Участник:Kirelagin|Кирилл Елагин]]&lt;br /&gt;
|-&lt;br /&gt;
|lectures||[[Участник:Igor buzhinsky|Игорь Бужинский]]&lt;br /&gt;
|-&lt;br /&gt;
|theory||[[Участник:Shevchen|Дмитрий Шевченко]]&lt;br /&gt;
|-&lt;br /&gt;
|outlines||[[Участник:Shevchen|Дмитрий Шевченко]]&lt;br /&gt;
|-&lt;br /&gt;
|wikikt||[[Участник:Mamoshkin.Arseny|Арсений Мамошкин]]&lt;br /&gt;
|-&lt;br /&gt;
|lecturenotes||[[Участник:Dgerasimov|Дмитрий Герасимов]]&lt;br /&gt;
|-&lt;br /&gt;
|ktlectures||[[Участник:SkudarnovYaroslav|Ярослав Скударнов]]&lt;br /&gt;
|-&lt;br /&gt;
|wiki||[[Участник:Андрей Шулаев|Андрей Шулаев]]&lt;br /&gt;
|-&lt;br /&gt;
|pediwikia||[[Участник:Pashkal|Павел Кротков]]&lt;br /&gt;
|-&lt;br /&gt;
|wikisynopses||[[Участник:Rybak|Андрей Рыбак]]&lt;br /&gt;
|-&lt;br /&gt;
|ctpedia||[[Участник:Borisov|Сергей Борисов]]&lt;br /&gt;
|-&lt;br /&gt;
|ctd||[[Участник:Borisov|Сергей Борисов]]&lt;br /&gt;
|-&lt;br /&gt;
|wikimath||[[Участник:Yurik|Александров Юрий]]&lt;br /&gt;
|-&lt;br /&gt;
|itmopedia||Марат Валиахметов&lt;br /&gt;
|-&lt;br /&gt;
|w||[[Участник:Tsar|Иоанн Волков]]&lt;br /&gt;
|-&lt;br /&gt;
|notes||[[Участник:Grechko|Гречко Владислав]]&lt;br /&gt;
|-&lt;br /&gt;
|medialibrary||[[Участник:Андреев Кирилл|Андреев Кирилл]]&lt;br /&gt;
|-&lt;br /&gt;
|algowiki||[[Участник:ЗабылПароль|Иванов Денис]]&lt;br /&gt;
|-&lt;br /&gt;
|wiki.ifmo.ru||[[Участник:Proshev|Прошев Семен]]&lt;br /&gt;
|-&lt;br /&gt;
|db.algowiki.ru||[[Участник:GeraltFromRivia|Завадский Дмитрий]]&lt;br /&gt;
|-&lt;br /&gt;
|wikicat ||[[Участник:Русин Никита|Русин Никита]]&lt;br /&gt;
|-&lt;br /&gt;
|algostore ||[[Участник:Русин Никита|Русин Никита]]&lt;br /&gt;
|-&lt;br /&gt;
|store ||[[Участник:Русин Никита|Русин Никита]]&lt;br /&gt;
|-&lt;br /&gt;
|ourwiki || [[Участник:kir1251|Голубев Кирилл]]&lt;br /&gt;
|-&lt;br /&gt;
|KTwiki || [[Участник:igorjan94|Колобов Игорь]]&lt;br /&gt;
|}&lt;br /&gt;
+1 за педивикию :D&lt;br /&gt;
: +1&lt;br /&gt;
:: +1 [3]&lt;br /&gt;
+1 за версию &amp;quot;вики&amp;quot;. Легче всего будет запомнить, wiki.ifmo&lt;/div&gt;</summary>
		<author><name>109.205.250.119</name></author>	</entry>

	</feed>