Files
knowledge_vault/математика/Блочная сортировка.md
2026-01-20 09:34:05 +05:00

25 lines
2.7 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
Алгоритм  в котором сортируемые элементы распределяются между конечным числом отдельных блоков так, чтобы все элементы в каждом следующем по порядку блоке были всегда больше (или меньше), чем в предыдущем. Каждый блок затем сортируется отдельно, либо рекурсивно тем же методом, либо другим. Затем элементы помещаются обратно в массив. Этот тип сортировки может обладать линейным временем исполнения. [Сложность алгоритма](Оценка%20сложности%20алгоритма): $O(n)$.
#### Алгоритм
Если входные элементы подчиняются равномерному закону распределения, то математическое ожидание времени работы алгоритма карманной сортировки является линейным. Это возможно благодаря определенным предположениям о входных данных. При карманной сортировке предполагается, что входные данные равномерно распределены на отрезке \[0, 1).
Идея алгоритма заключается в том, чтобы разбить отрезок \[0, 1) на $n$ одинаковых отрезков (карманов), и разделить по этим карманам $n$ входных величин. Поскольку входные числа равномерно распределены, предполагается, что в каждый карман попадет небольшое количество чисел. Затем последовательно сортируются числа в карманах. Отсортированный массив получается путём последовательного перечисления элементов каждого кармана.
#### Пример
![[sort_bucket.png]]
#### В виде кода
```python
def block_sort(arr, block_size=5):
if not arr:
return arr
min_val = min(arr)
max_val = max(arr)
block_count = (max_val - min_val) // block_size + 1
blocks = [[] for _ in range(block_count)]
for x in arr:
index = (x - min_val) // block_size
blocks[index].append(x)
result = []
for block in blocks:
block.sort()
result.extend(block)
return result
```