PSRS-сортировка — различия между версиями
AlexeyL (обсуждение | вклад)  (→Алгоритм)  | 
				AlexeyL (обсуждение | вклад)   (→Алгоритм)  | 
				||
| Строка 13: | Строка 13: | ||
* '''Шаг 6''' Делим данные в процессорах с помощью массива разделителей следующим образом. Пусть <tex>a_1, a_2,..., a_j</tex> {{---}} разделители. Тогда данные в каждом процессоре разобьём на группы элементов,                              попадающие в соответствующие полуинтервалы <tex>(-\infty,a_1],(a_1,a_2],...,(a_j,+\infty)</tex>.  | * '''Шаг 6''' Делим данные в процессорах с помощью массива разделителей следующим образом. Пусть <tex>a_1, a_2,..., a_j</tex> {{---}} разделители. Тогда данные в каждом процессоре разобьём на группы элементов,                              попадающие в соответствующие полуинтервалы <tex>(-\infty,a_1],(a_1,a_2],...,(a_j,+\infty)</tex>.  | ||
* '''Шаг 7''' Сливаем соответствующие группы элементов в массивы. Слияние будем производить поочерёдно, то есть сначала сольём первую группу со второй потом результат с третей и так далее. В итоге получим              отсортированный набор данных.  | * '''Шаг 7''' Сливаем соответствующие группы элементов в массивы. Слияние будем производить поочерёдно, то есть сначала сольём первую группу со второй потом результат с третей и так далее. В итоге получим              отсортированный набор данных.  | ||
| − | * '''Шаг 8'''   | + | * '''Шаг 8''' Данные из процессоров поочерёдно записываем в исходный массив. Данные отсортированы.  | 
* Конец  | * Конец  | ||
Версия 01:58, 12 июня 2014
Содержание
Описание
Parallel Sorting by Regular Sampling — параллельная сортировка, разработанная Ханмао Ши, Рисажем Канселом и Джонатаном Шеффером в 1992 году. Имеет два преимущества по сравнению с быстрой сортировкой:
- сохраняет размер списка более сбалансированным на протяжении всего процесса
 - избегает повторных перестановок ключей
 
Алгоритм
- Начало
 - Шаг 1 Исходный массив в элементов разделим поровну между процессорами.
 - Шаг 2 На каждом процессоре запускам быструю сортировку.
 - Шаг 3 Формируем вспомогательный массив из элементов каждого процессора под индексами .
 - Шаг 4 Сортируем вспомогательный массив с помощью быстрой сортировки.
 - Шаг 5 Формируем массив разделителей из элементов вспомогательного массива под индексами .
 - Шаг 6 Делим данные в процессорах с помощью массива разделителей следующим образом. Пусть — разделители. Тогда данные в каждом процессоре разобьём на группы элементов, попадающие в соответствующие полуинтервалы .
 - Шаг 7 Сливаем соответствующие группы элементов в массивы. Слияние будем производить поочерёдно, то есть сначала сольём первую группу со второй потом результат с третей и так далее. В итоге получим отсортированный набор данных.
 - Шаг 8 Данные из процессоров поочерёдно записываем в исходный массив. Данные отсортированы.
 - Конец
 
Пример
Количество элементов , количество процессоров . Исходный набор данных:
:
| Описание этапа | 1 процессор | 2 процессор | 3 процессор | 
|---|---|---|---|
| Разделение между процессорами | 15 46 48 93 39 6 72 91 14 | 36 69 40 89 61 97 12 21 54 | 53 97 84 58 32 27 33 72 20 | 
| После сортировки частей | 6 14 15 39 46 48 72 91 93 | 12 21 36 40 54 61 69 89 97 | 20 27 32 33 53 58 72 84 97 | 
| Выбор элементов | 6 14 15 39 46 48 72 91 93 | 12 21 36 40 54 61 69 89 97 | 20 27 32 33 53 58 72 84 97 | 
| Описание этапа | Данные | 
|---|---|
| Выбранные элементы | 6 39 72 12 40 69 20 33 72 | 
| После сортировки | 6 12 20 33 39 40 69 72 72 | 
| Выбор элементов | 6 12 20 33 39 40 69 72 72 | 
| Разделители | 33 69 | 
| Описание этапа | 1 процессор | 2 процессор | 3 процессор | ||||||
|---|---|---|---|---|---|---|---|---|---|
| После сортировки частей | 6 14 15 | 39 46 48 | 72 91 93 | 12 21 | 36 40 54 61 69 | 89 97 | 20 27 32 33 | 53 58 | 72 84 97 | 
| После обмена данными | 6 14 15 | 12 21 | 20 27 32 33 | 39 46 48 | 36 40 54 61 69 | 53 58 | 72 91 93 | 89 97 | 72 84 97 | 
| После слияния | 6 12 14 | 15 20 21 | 27 32 33 | 36 39 40 | 46 48 53 | 54 58 61 69 | 72 72 | 84 89 91 | 93 97 97 | 
Анализ
При  элементах и  процессорах начальная сортировка выполнится за . Выбор порядка  элементов в каждом процессоре произойдёт за , их сортировать мы будем с помощью быстрой сортировки, а так же учитывая, что их количество порядка , то можно сказать, что они сортируются за . После обмена данными будет произведено слияние  массивов в каждом процессоре. Также мы должны помнить, что при равномерном распределении данных длина сливаемых массивов будет , а  двух массивов выполняется за сумму их длин. Поэтому  займёт .  
                                                      
 
Отсюда получим: 
.