<?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=78.25.122.56&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=78.25.122.56&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/78.25.122.56"/>
		<updated>2026-06-29T05:01:37Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D1%8B%D1%81%D1%82%D1%80%D0%B0%D1%8F_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0&amp;diff=40547</id>
		<title>Быстрая сортировка</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D1%8B%D1%81%D1%82%D1%80%D0%B0%D1%8F_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0&amp;diff=40547"/>
				<updated>2014-10-27T16:41:08Z</updated>
		
		<summary type="html">&lt;p&gt;78.25.122.56: /* Разбиение массива */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Быстрая сортировка''' (qsort, сортировка Хоара) {{---}} один из самых известных и широко используемых алгоритмов сортировки. Среднее время работы &amp;lt;Tex&amp;gt;O(n\log{n})&amp;lt;/Tex&amp;gt;, что является асимптотически оптимальным временем работы для алгоритма, основанного на сравнении. Хотя время работы алгоритма для массива из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов в худшем случае может составить &amp;lt;tex&amp;gt;\Theta(n^2)&amp;lt;/tex&amp;gt;, на практике этот алгоритм является одним из самых быстрых.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм==&lt;br /&gt;
* из массива выбирается некоторый опорный элемент &amp;lt;tex&amp;gt;a[i]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* запускается процедура разделения массива, которая перемещает все ключи, меньшие, либо равные &amp;lt;tex&amp;gt;a[i]&amp;lt;/tex&amp;gt;, влево от него, а все ключи, большие, либо равные &amp;lt;tex&amp;gt;a[i]&amp;lt;/tex&amp;gt; {{---}} вправо.&lt;br /&gt;
* для обоих подмассивов: если в подмассиве более двух элементов, рекурсивно запускаем для него ту же процедуру..&lt;br /&gt;
&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
   '''function''' quicksort(A, l, r):&lt;br /&gt;
      '''if''' l &amp;lt; r&lt;br /&gt;
         q = partition(A, l, r)&lt;br /&gt;
         quicksort(A, l, q - 1)&lt;br /&gt;
         quicksort(A, q + 1, r)&lt;br /&gt;
Для сортировки всего массива необходимо выполнить процедуру &amp;lt;tex&amp;gt;\mathrm{quicksort(A, 0, length[A] - 1)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Разбиение массива===&lt;br /&gt;
Основной шаг алгоритма сортировки {{---}} процедура &amp;lt;tex&amp;gt;\mathrm{partition}&amp;lt;/tex&amp;gt;, которая переставляет элементы массива &amp;lt;tex&amp;gt;A[p..r]&amp;lt;/tex&amp;gt; нужным образом:&lt;br /&gt;
   '''int''' partition(A, l, r):&lt;br /&gt;
       x = A[l]&lt;br /&gt;
       i = l&lt;br /&gt;
       j = r&lt;br /&gt;
       '''while''' ''true'' &lt;br /&gt;
           '''while''' A[i] &amp;lt; x &lt;br /&gt;
                i = i + 1&lt;br /&gt;
           '''while''' A[j] &amp;gt; x &lt;br /&gt;
                j = j - 1&lt;br /&gt;
           '''if''' i &amp;lt; j &lt;br /&gt;
               swap(A[i++], A[j--])&lt;br /&gt;
           '''else''' &lt;br /&gt;
               '''return''' j&lt;br /&gt;
&lt;br /&gt;
==Асимптотика==&lt;br /&gt;
===Худшее время работы===&lt;br /&gt;
Предположим, что мы разбиваем массив так, что одна часть содержит &amp;lt;tex&amp;gt;n - 1&amp;lt;/tex&amp;gt; элементов, а вторая {{---}} &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Поскольку процедура разбиения занимает время &amp;lt;tex&amp;gt;\Theta(n)&amp;lt;/tex&amp;gt;, для времени работы &amp;lt;tex&amp;gt;T(n)&amp;lt;/tex&amp;gt; получаем соотношение:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T(n) = T(n - 1) + \Theta(n) = \sum\limits_{k=1}^{n} \Theta(k) = \Theta(\sum\limits_{k=1}^{n} k) = \Theta(n^2)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Мы видим, что при максимально несбалансированном разбиении время работы составляет &amp;lt;tex&amp;gt;\Theta(n^2)&amp;lt;/tex&amp;gt;. В частности, это происходит, если массив изначально отсортирован.&lt;br /&gt;
&lt;br /&gt;
===Среднее время работы===&lt;br /&gt;
{{&lt;br /&gt;
Лемма&lt;br /&gt;
|statement=Время работы алгоритма быстрой сортировки равно &amp;lt;tex&amp;gt;O(n \log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=Пусть Х {{---}} полное количество сравнений элементов с опорным за время работы сортировки. Нам необходимо вычислить полное количество сравнений.&lt;br /&gt;
Переименуем элементы массива как &amp;lt;tex&amp;gt;z_1...z_n&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;z_i&amp;lt;/tex&amp;gt; наименьший по порядку элемент.&lt;br /&gt;
Также введем множество &amp;lt;tex&amp;gt;Z_{ij} = \{z_i, z_{i+1}...z_j\}&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;X = \sum\limits_{i=1}^{n-1}\sum\limits_{j=i+1}^{n} X_{ij}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;X_{ij} = 1&amp;lt;/tex&amp;gt; если произошло сравнение &amp;lt;tex&amp;gt;z_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;z_j&amp;lt;/tex&amp;gt;  и &amp;lt;tex&amp;gt;X_{ij} = 0&amp;lt;/tex&amp;gt;, если сравнения не произошло.&lt;br /&gt;
&lt;br /&gt;
Применим к обоим частям равенства операцию вычисления матожидания и воспользовавшись ее линейностью получим&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;E[X] = E\left[\sum\limits_{i=1}^{n-1}\sum\limits_{j=i+1}^{n} X_{ij}\right] = \sum\limits_{i=1}^{n-1}\sum\limits_{j=i+1}^{n} E[X_{ij}] = \sum\limits_{i=1}^{n-1}\sum\limits_{j=i+1}^{n} Pr\{z_i&amp;lt;/tex&amp;gt; сравнивается с &amp;lt;tex&amp;gt;z_j\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Осталось вычислить величину &amp;lt;tex&amp;gt;Pr\{z_i&amp;lt;/tex&amp;gt; сравнивается с &amp;lt;tex&amp;gt;z_j\}&amp;lt;/tex&amp;gt; {{---}} вероятность того, что &amp;lt;tex&amp;gt;z_i&amp;lt;/tex&amp;gt; сравнивается с &amp;lt;tex&amp;gt;z_j&amp;lt;/tex&amp;gt;. Поскольку предполагается, что все элементы в массиве различны, то при выборе &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; в качестве опорного элемента впоследствии не будут сравниваться никакие &amp;lt;tex&amp;gt;z_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;z_j&amp;lt;/tex&amp;gt; для которых &amp;lt;tex&amp;gt;z_i &amp;lt; x &amp;lt; z_j&amp;lt;/tex&amp;gt;. С другой стороны, если &amp;lt;tex&amp;gt;z_i&amp;lt;/tex&amp;gt; выбран в качестве опорного, то он будет сравниваться с каждым элементом &amp;lt;tex&amp;gt;Z_{ij}&amp;lt;/tex&amp;gt; кроме себя самого. Таким образом элементы &amp;lt;tex&amp;gt;z_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;z_j&amp;lt;/tex&amp;gt; сравниваются тогда и только тогда когда первым в множестве &amp;lt;tex&amp;gt;Z_{ij}&amp;lt;/tex&amp;gt; опорным элементом был выбран один из них.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;Pr\{z_i&amp;lt;/tex&amp;gt; сравнивается с &amp;lt;tex&amp;gt;z_j\} = &lt;br /&gt;
Pr\{&amp;lt;/tex&amp;gt;первым опорным элементом был &amp;lt;tex&amp;gt;z_i&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;z_j\} = &lt;br /&gt;
Pr\{&amp;lt;/tex&amp;gt;первым опорным элементом был &amp;lt;tex&amp;gt;z_i\} +&lt;br /&gt;
Pr\{&amp;lt;/tex&amp;gt;первым опорным элементом был &amp;lt;tex&amp;gt;z_j\} =&lt;br /&gt;
\frac {1}{j-i+1} + \frac {1}{j-i+1}  = \frac {2}{j-i+1} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; E[X] = \sum\limits_{i=1}^{n-1}\sum\limits_{j=i+1}^{n} \frac {2}{j-i+1} = \sum\limits_{i=1}^{n-1}\sum\limits_{k=1}^{n-i} \frac 2{k+1} &amp;lt; \sum\limits_{i=1}^{n-1}\sum\limits_{k=1}^{n-i} \frac 2{k} = \sum\limits_{i=1}^{n-1}O(\log n) = O(n \log n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Mатожидание времени работы быстрой сортировки будет &amp;lt;tex&amp;gt;O(n \log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&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^2)&amp;lt;/tex&amp;gt;. Существуют различные способы разбиения массива, направленные против худшего случая:&lt;br /&gt;
* При выборе опорного элемента из данного диапазона случайным образом худший случай становится очень маловероятным и ожидаемое время выполнения алгоритма сортировки — &amp;lt;tex&amp;gt;O(n \log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Выбирать опорным элементом средний из трех (первого, среднего и последнего элементов).&lt;br /&gt;
* Разбивать массив не на две, а на три части.&lt;br /&gt;
&lt;br /&gt;
==Оптимизация глубины рекурсии до O(logn) в худшем случае==&lt;br /&gt;
Во избежание достижения опасной глубины рекурсии в худшем случае (или при приближении к нему) возможна модификация алгоритма, устраняющая одну ветвь рекурсии: вместо того, чтобы после разделения массива вызывать рекурсивно процедуру разделения для обоих найденных подмассивов, рекурсивный вызов делается только для меньшего подмассива, а больший обрабатывается в цикле в пределах этого же вызова процедуры. С точки зрения эффективности в среднем случае разницы практически нет: накладные расходы на дополнительный рекурсивный вызов и на организацию сравнения длин подмассивов и цикла — примерно одного порядка. Зато глубина рекурсии ни при каких обстоятельствах не превысит &amp;lt;tex&amp;gt;\log n&amp;lt;/tex&amp;gt;, а в худшем случае вырожденного разделения она вообще будет не более 2 — вся обработка пройдёт в цикле первого уровня рекурсии.&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [[wikipedia:Быстрая сортировка|Википедия {{---}} быстрая сортировка]]&lt;br /&gt;
* [[wikipedia:Quicksort|Wikipedia {{---}} Quicksort]]&lt;br /&gt;
* ''Т. Кормен, Ч. Лейзерсон, Р. Ривест'': Алгоритмы: построение и анализ глава 7&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Сортировка]]&lt;/div&gt;</summary>
		<author><name>78.25.122.56</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D1%8B%D1%81%D1%82%D1%80%D0%B0%D1%8F_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0&amp;diff=40546</id>
		<title>Быстрая сортировка</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D1%8B%D1%81%D1%82%D1%80%D0%B0%D1%8F_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0&amp;diff=40546"/>
				<updated>2014-10-27T16:39:43Z</updated>
		
		<summary type="html">&lt;p&gt;78.25.122.56: /* Разбиение массива */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Быстрая сортировка''' (qsort, сортировка Хоара) {{---}} один из самых известных и широко используемых алгоритмов сортировки. Среднее время работы &amp;lt;Tex&amp;gt;O(n\log{n})&amp;lt;/Tex&amp;gt;, что является асимптотически оптимальным временем работы для алгоритма, основанного на сравнении. Хотя время работы алгоритма для массива из &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; элементов в худшем случае может составить &amp;lt;tex&amp;gt;\Theta(n^2)&amp;lt;/tex&amp;gt;, на практике этот алгоритм является одним из самых быстрых.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм==&lt;br /&gt;
* из массива выбирается некоторый опорный элемент &amp;lt;tex&amp;gt;a[i]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* запускается процедура разделения массива, которая перемещает все ключи, меньшие, либо равные &amp;lt;tex&amp;gt;a[i]&amp;lt;/tex&amp;gt;, влево от него, а все ключи, большие, либо равные &amp;lt;tex&amp;gt;a[i]&amp;lt;/tex&amp;gt; {{---}} вправо.&lt;br /&gt;
* для обоих подмассивов: если в подмассиве более двух элементов, рекурсивно запускаем для него ту же процедуру..&lt;br /&gt;
&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
   '''function''' quicksort(A, l, r):&lt;br /&gt;
      '''if''' l &amp;lt; r&lt;br /&gt;
         q = partition(A, l, r)&lt;br /&gt;
         quicksort(A, l, q - 1)&lt;br /&gt;
         quicksort(A, q + 1, r)&lt;br /&gt;
Для сортировки всего массива необходимо выполнить процедуру &amp;lt;tex&amp;gt;\mathrm{quicksort(A, 0, length[A] - 1)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Разбиение массива===&lt;br /&gt;
Основной шаг алгоритма сортировки {{---}} процедура &amp;lt;tex&amp;gt;\mathrm{partition}&amp;lt;/tex&amp;gt;, которая переставляет элементы массива &amp;lt;tex&amp;gt;A[p..r]&amp;lt;/tex&amp;gt; нужным образом:&lt;br /&gt;
   '''int''' partition(A, l, r):&lt;br /&gt;
       x = A[l]&lt;br /&gt;
       i = l&lt;br /&gt;
       j = r&lt;br /&gt;
       '''while''' ''true'' &lt;br /&gt;
           '''while''' A[i] &amp;lt; x &lt;br /&gt;
                i = i + 1&lt;br /&gt;
           '''while''' A[j] &amp;gt; x &lt;br /&gt;
                j = j - 1&lt;br /&gt;
           '''if''' i &amp;lt; j &lt;br /&gt;
               swap(A[i++], A[j++])&lt;br /&gt;
           '''else''' &lt;br /&gt;
               '''return''' j&lt;br /&gt;
&lt;br /&gt;
==Асимптотика==&lt;br /&gt;
===Худшее время работы===&lt;br /&gt;
Предположим, что мы разбиваем массив так, что одна часть содержит &amp;lt;tex&amp;gt;n - 1&amp;lt;/tex&amp;gt; элементов, а вторая {{---}} &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;. Поскольку процедура разбиения занимает время &amp;lt;tex&amp;gt;\Theta(n)&amp;lt;/tex&amp;gt;, для времени работы &amp;lt;tex&amp;gt;T(n)&amp;lt;/tex&amp;gt; получаем соотношение:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T(n) = T(n - 1) + \Theta(n) = \sum\limits_{k=1}^{n} \Theta(k) = \Theta(\sum\limits_{k=1}^{n} k) = \Theta(n^2)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Мы видим, что при максимально несбалансированном разбиении время работы составляет &amp;lt;tex&amp;gt;\Theta(n^2)&amp;lt;/tex&amp;gt;. В частности, это происходит, если массив изначально отсортирован.&lt;br /&gt;
&lt;br /&gt;
===Среднее время работы===&lt;br /&gt;
{{&lt;br /&gt;
Лемма&lt;br /&gt;
|statement=Время работы алгоритма быстрой сортировки равно &amp;lt;tex&amp;gt;O(n \log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=Пусть Х {{---}} полное количество сравнений элементов с опорным за время работы сортировки. Нам необходимо вычислить полное количество сравнений.&lt;br /&gt;
Переименуем элементы массива как &amp;lt;tex&amp;gt;z_1...z_n&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;z_i&amp;lt;/tex&amp;gt; наименьший по порядку элемент.&lt;br /&gt;
Также введем множество &amp;lt;tex&amp;gt;Z_{ij} = \{z_i, z_{i+1}...z_j\}&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;X = \sum\limits_{i=1}^{n-1}\sum\limits_{j=i+1}^{n} X_{ij}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;X_{ij} = 1&amp;lt;/tex&amp;gt; если произошло сравнение &amp;lt;tex&amp;gt;z_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;z_j&amp;lt;/tex&amp;gt;  и &amp;lt;tex&amp;gt;X_{ij} = 0&amp;lt;/tex&amp;gt;, если сравнения не произошло.&lt;br /&gt;
&lt;br /&gt;
Применим к обоим частям равенства операцию вычисления матожидания и воспользовавшись ее линейностью получим&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;E[X] = E\left[\sum\limits_{i=1}^{n-1}\sum\limits_{j=i+1}^{n} X_{ij}\right] = \sum\limits_{i=1}^{n-1}\sum\limits_{j=i+1}^{n} E[X_{ij}] = \sum\limits_{i=1}^{n-1}\sum\limits_{j=i+1}^{n} Pr\{z_i&amp;lt;/tex&amp;gt; сравнивается с &amp;lt;tex&amp;gt;z_j\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Осталось вычислить величину &amp;lt;tex&amp;gt;Pr\{z_i&amp;lt;/tex&amp;gt; сравнивается с &amp;lt;tex&amp;gt;z_j\}&amp;lt;/tex&amp;gt; {{---}} вероятность того, что &amp;lt;tex&amp;gt;z_i&amp;lt;/tex&amp;gt; сравнивается с &amp;lt;tex&amp;gt;z_j&amp;lt;/tex&amp;gt;. Поскольку предполагается, что все элементы в массиве различны, то при выборе &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; в качестве опорного элемента впоследствии не будут сравниваться никакие &amp;lt;tex&amp;gt;z_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;z_j&amp;lt;/tex&amp;gt; для которых &amp;lt;tex&amp;gt;z_i &amp;lt; x &amp;lt; z_j&amp;lt;/tex&amp;gt;. С другой стороны, если &amp;lt;tex&amp;gt;z_i&amp;lt;/tex&amp;gt; выбран в качестве опорного, то он будет сравниваться с каждым элементом &amp;lt;tex&amp;gt;Z_{ij}&amp;lt;/tex&amp;gt; кроме себя самого. Таким образом элементы &amp;lt;tex&amp;gt;z_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;z_j&amp;lt;/tex&amp;gt; сравниваются тогда и только тогда когда первым в множестве &amp;lt;tex&amp;gt;Z_{ij}&amp;lt;/tex&amp;gt; опорным элементом был выбран один из них.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;Pr\{z_i&amp;lt;/tex&amp;gt; сравнивается с &amp;lt;tex&amp;gt;z_j\} = &lt;br /&gt;
Pr\{&amp;lt;/tex&amp;gt;первым опорным элементом был &amp;lt;tex&amp;gt;z_i&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;z_j\} = &lt;br /&gt;
Pr\{&amp;lt;/tex&amp;gt;первым опорным элементом был &amp;lt;tex&amp;gt;z_i\} +&lt;br /&gt;
Pr\{&amp;lt;/tex&amp;gt;первым опорным элементом был &amp;lt;tex&amp;gt;z_j\} =&lt;br /&gt;
\frac {1}{j-i+1} + \frac {1}{j-i+1}  = \frac {2}{j-i+1} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; E[X] = \sum\limits_{i=1}^{n-1}\sum\limits_{j=i+1}^{n} \frac {2}{j-i+1} = \sum\limits_{i=1}^{n-1}\sum\limits_{k=1}^{n-i} \frac 2{k+1} &amp;lt; \sum\limits_{i=1}^{n-1}\sum\limits_{k=1}^{n-i} \frac 2{k} = \sum\limits_{i=1}^{n-1}O(\log n) = O(n \log n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Mатожидание времени работы быстрой сортировки будет &amp;lt;tex&amp;gt;O(n \log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&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^2)&amp;lt;/tex&amp;gt;. Существуют различные способы разбиения массива, направленные против худшего случая:&lt;br /&gt;
* При выборе опорного элемента из данного диапазона случайным образом худший случай становится очень маловероятным и ожидаемое время выполнения алгоритма сортировки — &amp;lt;tex&amp;gt;O(n \log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Выбирать опорным элементом средний из трех (первого, среднего и последнего элементов).&lt;br /&gt;
* Разбивать массив не на две, а на три части.&lt;br /&gt;
&lt;br /&gt;
==Оптимизация глубины рекурсии до O(logn) в худшем случае==&lt;br /&gt;
Во избежание достижения опасной глубины рекурсии в худшем случае (или при приближении к нему) возможна модификация алгоритма, устраняющая одну ветвь рекурсии: вместо того, чтобы после разделения массива вызывать рекурсивно процедуру разделения для обоих найденных подмассивов, рекурсивный вызов делается только для меньшего подмассива, а больший обрабатывается в цикле в пределах этого же вызова процедуры. С точки зрения эффективности в среднем случае разницы практически нет: накладные расходы на дополнительный рекурсивный вызов и на организацию сравнения длин подмассивов и цикла — примерно одного порядка. Зато глубина рекурсии ни при каких обстоятельствах не превысит &amp;lt;tex&amp;gt;\log n&amp;lt;/tex&amp;gt;, а в худшем случае вырожденного разделения она вообще будет не более 2 — вся обработка пройдёт в цикле первого уровня рекурсии.&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [[wikipedia:Быстрая сортировка|Википедия {{---}} быстрая сортировка]]&lt;br /&gt;
* [[wikipedia:Quicksort|Wikipedia {{---}} Quicksort]]&lt;br /&gt;
* ''Т. Кормен, Ч. Лейзерсон, Р. Ривест'': Алгоритмы: построение и анализ глава 7&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Сортировка]]&lt;/div&gt;</summary>
		<author><name>78.25.122.56</name></author>	</entry>

	</feed>