Устойчивость к сдвигу - PullRequest
2 голосов
/ 25 марта 2020

Я сталкиваюсь с этим параллельным (параллельным) алгоритмом сортировки, называемым сортировкой по сдвигу. Я понимаю, что он рассматривает список N-элементов как квадратную матрицу √N. Затем он выполняет сортировку строк в чередующихся направлениях. Затем он выполняет сортировку столбцов. Это повторяется до тех пор, пока не произойдет своп.

Visualisation of sorting

У меня вопрос: он стабилен?

Может кто-нибудь показать мне доказательство стабильности или правильность?

Может кто-нибудь показать мне Python реализацию этого?

Ответы [ 2 ]

1 голос
/ 25 марта 2020

Вот простой контрпример для стабильности. Очевидно, что если ваш алгоритм сортировки строк и столбцов нестабилен, полная сортировка не имеет шансов быть стабильной, поэтому предположим, что вы выбрали стабильную подсортировку.

0  0  2  2
1  1  0  0
1  1  1' 2
2  2  2  2

Сортировка по столбцам:

0  0  0  0
1  1  1' 2
1  1  2  2
2  2  2  2

И через несколько шагов вы получите

0  0  0  0
1  1  1  1'
1  2  2  2
2  2  2  2

1' было перемещено раньше других 1 с, алгоритм не стабилен.

Корректность равна тривиально:

Можно без ограничения общности предположить, что алгоритм внутренней сортировки выглядит следующим образом:

while the list is not sorted:
    select i < j such that x[i] > x[j].
    swap x[i] and x[j]

Тогда весь алгоритм состоит только из таких перестановок, следовательно, поскольку существует конечный число таких i, j в начале, затем алгоритм должен завершиться.

Легко доказать, что, когда перестановок больше не происходит, весь список сортируется (сравните элементы в концы)

a < b < c < d
h > g > f > e
i < j < k < l
p > o > n > m

Поскольку вертикальные перестановки не выполняются, то в частности d < e, h < i и l < m.

Это также показывает, что вам нужно сортировать только по вертикали два крайних цв ВМН. Сортировка всех из них только улучшит производительность.

chqrl ie для ответа желтой цитаты дал мне идею для еще более простого примера счетчика:

1  0  ------>  0' 0
0' 0  columns  1  0

1 0 0 0' отсортировано по 0' 0 0 1. Это наименьший возможный встречный пример, так как все списки из 2 и 3 элементов отсортированы стабильно.

0 голосов
/ 26 марта 2020

Алгоритм сортировки строк и столбцов должен быть стабильным: в противном случае массив с одинаковыми элементами может быть переупорядочен, что нарушает стабильность.

Однако этого условия недостаточно: сортировка при сдвиге в качестве документа нестабильна. Вот пример меньшего счетчика:

Вот список из 9 элементов: A1 A2 B1 A3 A4 A5 A6 A7 A8.

Все Ax элементы сравниваются равными и меньшими B1

Вот соответствующая матрица хранится в исходном порядке:

A1  A2  B1
A5  A4  A3
A6  A7  A8

Строки отсортированы по горизонтали в зигзагообразном порядке: без изменений

Столбцы отсортированы по вертикали:

A1  A2  A3
A5  A4  A8
A6  A7  B1

Строки отсортированы по горизонтали в зигзагообразном порядке: без изменений, значит, все готово.

Окончательный порядок: A1, A2, A3, A8, A4, A5, A6, A7, B1: относительный порядок элементов Ax изменился.

QED

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...