<?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=Lyobzik</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=Lyobzik"/>
		<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/Lyobzik"/>
		<updated>2026-07-14T01:09:14Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%B0%D1%80%D0%BC%D0%B0%D0%BD%D0%BD%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=56689</id>
		<title>Карманная сортировка</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%B0%D1%80%D0%BC%D0%B0%D0%BD%D0%BD%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=56689"/>
				<updated>2016-12-03T06:29:06Z</updated>
		
		<summary type="html">&lt;p&gt;Lyobzik: Исправлено вычисление диапазона значений в блоке&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:Bucket-sort-example1.jpg|right|400px|thumb|Пример работы рекурсивного Bucketsort.]]&lt;br /&gt;
'''Карманная сортировка''' (англ. ''Bucket sort'')  {{---}} алгоритм [[Сортировки|сортировки]], основанный на предположении о равномерном распределении входных данных.&lt;br /&gt;
== Алгоритм сортировки ==&lt;br /&gt;
=== Принцип работы ===&lt;br /&gt;
Для карманной сортировки нужно разбить элементы массива входных данных на &amp;lt;tex&amp;gt;k&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;
==== Рекурсивный bucket sort ====&lt;br /&gt;
Рассмотрим код работы рекурсивной реализации карманной сортировки.&lt;br /&gt;
&lt;br /&gt;
На вход подаются вещественные числа.&lt;br /&gt;
 '''double[]''' bucketSort ('''double[]''' array, '''double''' minElement, '''double''' maxElement) &lt;br /&gt;
    '''if''' array.length &amp;lt; 2 '''or''' minElement == maxElement&lt;br /&gt;
        '''return''' array;&lt;br /&gt;
    range = maxElement - minElement&lt;br /&gt;
    '''for''' i = 0  '''to''' array.length - 1  &lt;br /&gt;
        index = int(array[i] * numBuckets / range)&lt;br /&gt;
        добавим array[i] в конец buckets[index]&lt;br /&gt;
        minBucktes[index] = '''minimum'''(buckets[index], array[i])&lt;br /&gt;
        maxBuckets[index] = '''maximum'''(buckets[index], array[i])&lt;br /&gt;
    '''for''' i = 0 '''to''' numBuckets - 1&lt;br /&gt;
        buckets[i] = bucketSort(buckets[i], minBucktes[i], maxBuckets[i])&lt;br /&gt;
    '''for''' i = 0 '''to''' numBuckets - 1&lt;br /&gt;
        '''for''' k = 0 '''to''' buckets[i].length - 1&lt;br /&gt;
            добавим buckets[i][k] в конец answer&lt;br /&gt;
    '''return''' answer&lt;br /&gt;
&lt;br /&gt;
==== Нерекурсивная реализация ====&lt;br /&gt;
 '''double[]''' bucketSort('''double[]''' array) &lt;br /&gt;
    minElement = Infinum&lt;br /&gt;
    maxElement = -Infinum&lt;br /&gt;
    '''for''' i = 0 '''to''' array.length - 1&lt;br /&gt;
        minElement = '''minimum'''(minElement, array[i])&lt;br /&gt;
        maxElement = '''maximum'''(maxElement, array[i]) &lt;br /&gt;
    range = maxElement - minElement&lt;br /&gt;
    '''for''' i = 0  '''to''' array.length - 1  &lt;br /&gt;
        index = int(array[i] * numBuckets / range)&lt;br /&gt;
        добавим array[i] в конец buckets[index]&lt;br /&gt;
    '''for''' i = 0 '''to''' numBuckets - 1&lt;br /&gt;
        buckets[i] = sort(buckets[i])&lt;br /&gt;
    '''for''' i = 0 '''to''' numBuckets - 1&lt;br /&gt;
        '''for''' k = 0 '''to''' buckets[i].length - 1&lt;br /&gt;
            добавим buckets[i][k] в конец answer&lt;br /&gt;
    '''return''' answer&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;k&amp;lt;/tex&amp;gt; {{---}} количество блоков для разбиения.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; n_i &amp;lt;/tex&amp;gt; {{---}} случайная величина, обозначающая количество элементов попавших в &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;-ый карман.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; T(n) = \Theta(n) + \sum\limits_{i = 1}^k O(n_i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; \log n_i) + \Theta(k)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; T(n) &amp;lt;/tex&amp;gt; время работы алгоритма карманной сортировки.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; E[n_i] = \dfrac {n}{k} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
То есть, если &amp;lt;tex&amp;gt; n \sim k \Rightarrow  E[T(n)] = \Theta(n) &amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Если, &amp;lt;tex&amp;gt; n = o(k) \Rightarrow E[T(n)] = \Theta(k)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Из приведенных выше формул, видно, что в среднем &amp;quot;карманная сортировка&amp;quot; работает за линейное время.&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Bucket_sort Wikipedia — Bucket sort]&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/%D0%91%D0%BB%D0%BE%D1%87%D0%BD%D0%B0%D1%8F_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0 Википедия — Блочная сортировка]&lt;br /&gt;
 &lt;br /&gt;
* [http://www.google.ru/url?sa=t&amp;amp;rct=j&amp;amp;q=&amp;amp;esrc=s&amp;amp;source=web&amp;amp;cd=10&amp;amp;ved=0CI0BEBYwCQ&amp;amp;url=http%3A%2F%2Fcs.iupui.edu%2F~xkzou%2Fteaching%2FCS580%2FSortinginlineartime.ppt&amp;amp;ei=d7fUT8WWIs3S4QSkkPT-Ag&amp;amp;usg=AFQjCNEUbmlVNhSgrJKV9-QjPBwU6U0obQ&amp;amp;sig2=3yaysrpuwVjmyhjBCpyBeQ Презентация о линейных сортировках]&lt;br /&gt;
* [https://www-927.ibm.com/ibm/cas/hspc/student/algorithms/BucketSort.html Описание алгоритма с реализацией рекурсивной версии на языке Java]&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Сортировки]]&lt;br /&gt;
[[Категория: Другие сортировки]]&lt;/div&gt;</summary>
		<author><name>Lyobzik</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%B0%D1%80%D0%BC%D0%B0%D0%BD%D0%BD%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=56688</id>
		<title>Карманная сортировка</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%B0%D1%80%D0%BC%D0%B0%D0%BD%D0%BD%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=56688"/>
				<updated>2016-12-03T06:21:31Z</updated>
		
		<summary type="html">&lt;p&gt;Lyobzik: Исправленно вычисление граничных значений блока&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:Bucket-sort-example1.jpg|right|400px|thumb|Пример работы рекурсивного Bucketsort.]]&lt;br /&gt;
'''Карманная сортировка''' (англ. ''Bucket sort'')  {{---}} алгоритм [[Сортировки|сортировки]], основанный на предположении о равномерном распределении входных данных.&lt;br /&gt;
== Алгоритм сортировки ==&lt;br /&gt;
=== Принцип работы ===&lt;br /&gt;
Для карманной сортировки нужно разбить элементы массива входных данных на &amp;lt;tex&amp;gt;k&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;
==== Рекурсивный bucket sort ====&lt;br /&gt;
Рассмотрим код работы рекурсивной реализации карманной сортировки.&lt;br /&gt;
&lt;br /&gt;
На вход подаются вещественные числа.&lt;br /&gt;
 '''double[]''' bucketSort ('''double[]''' array, '''double''' minElement, '''double''' maxElement) &lt;br /&gt;
    '''if''' array.length &amp;lt; 2 '''or''' minElement == maxElement&lt;br /&gt;
        '''return''' array;&lt;br /&gt;
    range = maxElement - minElement&lt;br /&gt;
    '''for''' i = 0  '''to''' array.length - 1  &lt;br /&gt;
        index = int(array[i] * numBuckets / range)&lt;br /&gt;
        добавим array[i] в конец buckets[index]&lt;br /&gt;
        minBucktes[index] = '''minimum'''(buckets[index], array[i])&lt;br /&gt;
        maxBuckets[index] = '''maximum'''(buckets[index], array[i])&lt;br /&gt;
    '''for''' i = 0 '''to''' numBuckets - 1&lt;br /&gt;
        buckets[i] = bucketSort(buckets[i], minBucktes[i], maxBuckets[i])&lt;br /&gt;
    '''for''' i = 0 '''to''' numBuckets - 1&lt;br /&gt;
        '''for''' k = 0 '''to''' buckets[i].length - 1&lt;br /&gt;
            добавим buckets[i][k] в конец answer&lt;br /&gt;
    '''return''' answer&lt;br /&gt;
&lt;br /&gt;
==== Нерекурсивная реализация ====&lt;br /&gt;
 '''double[]''' bucketSort('''double[]''' array) &lt;br /&gt;
    minElement = Infinum&lt;br /&gt;
    maxElement = -Infinum&lt;br /&gt;
    '''for''' i = 0 '''to''' array.length - 1&lt;br /&gt;
        minElement = '''minimum'''(minElement, array[i])&lt;br /&gt;
        maxElement = '''maximum'''(maxElement, array[i]) &lt;br /&gt;
    '''for''' i = 0  '''to''' array.length - 1  &lt;br /&gt;
        index = int(array[i] * numBuckets / range)&lt;br /&gt;
        добавим array[i] в конец buckets[index]&lt;br /&gt;
    '''for''' i = 0 '''to''' numBuckets - 1&lt;br /&gt;
        buckets[i] = sort(buckets[i])&lt;br /&gt;
    '''for''' i = 0 '''to''' numBuckets - 1&lt;br /&gt;
        '''for''' k = 0 '''to''' buckets[i].length - 1&lt;br /&gt;
            добавим buckets[i][k] в конец answer&lt;br /&gt;
    '''return''' answer &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;k&amp;lt;/tex&amp;gt; {{---}} количество блоков для разбиения.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; n_i &amp;lt;/tex&amp;gt; {{---}} случайная величина, обозначающая количество элементов попавших в &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;-ый карман.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; T(n) = \Theta(n) + \sum\limits_{i = 1}^k O(n_i&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; \log n_i) + \Theta(k)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; T(n) &amp;lt;/tex&amp;gt; время работы алгоритма карманной сортировки.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; E[n_i] = \dfrac {n}{k} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
То есть, если &amp;lt;tex&amp;gt; n \sim k \Rightarrow  E[T(n)] = \Theta(n) &amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Если, &amp;lt;tex&amp;gt; n = o(k) \Rightarrow E[T(n)] = \Theta(k)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Из приведенных выше формул, видно, что в среднем &amp;quot;карманная сортировка&amp;quot; работает за линейное время.&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Bucket_sort Wikipedia — Bucket sort]&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/%D0%91%D0%BB%D0%BE%D1%87%D0%BD%D0%B0%D1%8F_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0 Википедия — Блочная сортировка]&lt;br /&gt;
 &lt;br /&gt;
* [http://www.google.ru/url?sa=t&amp;amp;rct=j&amp;amp;q=&amp;amp;esrc=s&amp;amp;source=web&amp;amp;cd=10&amp;amp;ved=0CI0BEBYwCQ&amp;amp;url=http%3A%2F%2Fcs.iupui.edu%2F~xkzou%2Fteaching%2FCS580%2FSortinginlineartime.ppt&amp;amp;ei=d7fUT8WWIs3S4QSkkPT-Ag&amp;amp;usg=AFQjCNEUbmlVNhSgrJKV9-QjPBwU6U0obQ&amp;amp;sig2=3yaysrpuwVjmyhjBCpyBeQ Презентация о линейных сортировках]&lt;br /&gt;
* [https://www-927.ibm.com/ibm/cas/hspc/student/algorithms/BucketSort.html Описание алгоритма с реализацией рекурсивной версии на языке Java]&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Сортировки]]&lt;br /&gt;
[[Категория: Другие сортировки]]&lt;/div&gt;</summary>
		<author><name>Lyobzik</name></author>	</entry>

	</feed>