Стандартные сортировочные сети для малых значений n
Я ищу сетевую реализацию сортировки 5-элементной сортировки, но поскольку я не смог найти хорошую ссылку на SO, я хотел бы попросить сортировать сети для всех небольших значений n, по крайней мере, n=3 через n=6, но более высокие значения тоже были бы отличными. Хороший ответ должен, по крайней мере, перечислить их как последовательности операций "swap" (сортировка по 2 элементам), но также было бы неплохо увидеть рекурсивную декомпозицию в терминах сетей сортировки нижнего порядка.
для моего приложения, I на самом деле заботятся только о медиане 5 элементов, а не о том, чтобы привести их в порядок. То есть порядок остальных 4 элементов может быть не определен в результате, пока медиана заканчивается в нужном месте. Можно ли использовать подход, связанный с сортировкой сетей, для вычисления медианы с меньшим количеством свопов, чем выполнение полной сортировки? Если это так, то такое решение моей проблемы (для n=5) и для других случаев тоже было бы отличным ответом.
(Примечание: я пометил этот вопрос C, потому что C является язык, который я использую, и я подозреваю, что люди, которые следуют тегу C, имеют хорошие ответы, но мне все равно, написан ли ответ на самом деле на C или псевдокод, если он легко переводится на C, что он, естественно, должен делать, пока выполняются вышеупомянутые критерии.)
3 ответов
Выберите один из каждого раздела, предположительно, тот, который работает быстрее всего на вашем оборудовании, так как мы твердо находимся в области "дьявольской оптимизации":http://smarterrecall.com/networks.html, воспроизводится ниже:
Я создал этот сайт, чтобы перечислить все возможные оптимальные сети сортировки до 6-входов, написанных с помощью программы в matlab. Самая длинная трасса-время на 5-входы на 45 секунд. Если вы заинтересованы в контакте со мной, со мной можно связаться по адресу rpl1 [AT] rice [DOT] Эде Овации, Ричард Л.
----------
- 2-input: 1 network
[[1 2]]
----------
- 3-input: 6 networks
[[1 2][1 3][2 3]]
[[1 2][2 3][1 2]]
[[1 3][1 2][2 3]]
[[1 3][2 3][1 2]]
[[2 3][1 2][2 3]]
[[2 3][1 3][1 2]]
----------
- 4-input: 3 networks
[[1 2][3 4][1 3][2 4][2 3]]
[[1 3][2 4][1 2][3 4][2 3]]
[[1 4][2 3][1 2][3 4][2 3]]
----------
- 5-input: 180 networks
[[1 2][3 4][1 3][2 5][1 2][3 4][2 3][4 5][3 4]]
[[1 2][3 4][1 3][2 5][2 3][4 5][1 2][3 4][2 3]]
[[1 2][3 4][1 3][4 5][1 4][2 3][2 4][3 5][3 4]]
[[1 2][3 4][1 3][4 5][2 5][3 4][1 3][2 4][2 3]]
[[1 2][3 4][1 4][2 5][2 3][4 5][1 2][3 4][2 3]]
[[1 2][3 4][1 4][3 5][1 3][2 5][2 3][4 5][3 4]]
[[1 2][3 4][1 5][2 3][1 2][4 5][2 4][3 5][3 4]]
[[1 2][3 4][1 5][2 4][1 3][2 5][2 3][4 5][3 4]]
[[1 2][3 4][1 5][2 4][2 3][4 5][1 2][3 4][2 3]]
[[1 2][3 4][2 3][4 5][1 4][3 5][1 2][3 4][2 3]]
[[1 2][3 4][2 4][3 5][1 2][4 5][1 3][2 4][2 3]]
[[1 2][3 4][2 4][3 5][1 3][2 5][2 3][4 5][3 4]]
[[1 2][3 5][1 3][2 4][1 2][3 5][2 3][4 5][3 4]]
[[1 2][3 5][1 3][2 4][2 3][4 5][1 2][3 4][2 3]]
[[1 2][3 5][1 3][4 5][1 4][2 3][2 4][3 5][3 4]]
[[1 2][3 5][1 3][4 5][2 5][3 4][1 3][2 4][2 3]]
[[1 2][3 5][1 4][2 3][1 2][4 5][2 4][3 5][3 4]]
[[1 2][3 5][1 4][2 5][1 3][2 4][2 3][4 5][3 4]]
[[1 2][3 5][1 4][2 5][2 3][4 5][1 2][3 4][2 3]]
[[1 2][3 5][1 5][2 4][2 3][4 5][1 2][3 4][2 3]]
[[1 2][3 5][1 5][3 4][1 3][2 4][2 3][4 5][3 4]]
[[1 2][3 5][2 3][4 5][1 4][3 5][1 2][3 4][2 3]]
[[1 2][3 5][2 5][3 4][1 2][4 5][1 3][2 4][2 3]]
[[1 2][3 5][2 5][3 4][1 3][2 4][2 3][4 5][3 4]]
[[1 2][4 5][1 3][2 4][1 2][3 5][2 3][4 5][3 4]]
[[1 2][4 5][1 3][2 5][1 4][2 3][2 4][3 5][3 4]]
[[1 2][4 5][1 3][2 5][2 4][3 5][1 2][3 4][2 3]]
[[1 2][4 5][1 4][2 3][1 2][4 5][2 4][3 5][3 4]]
[[1 2][4 5][1 4][2 3][2 4][3 5][1 2][3 4][2 3]]
[[1 2][4 5][1 4][3 5][1 3][2 4][2 3][4 5][3 4]]
[[1 2][4 5][1 4][3 5][2 5][3 4][1 3][2 4][2 3]]
[[1 2][4 5][1 5][2 3][2 4][3 5][1 2][3 4][2 3]]
[[1 2][4 5][1 5][3 4][1 3][2 4][2 3][4 5][3 4]]
[[1 2][4 5][2 4][3 5][1 3][4 5][1 2][3 4][2 3]]
[[1 2][4 5][2 5][3 4][1 2][4 5][1 3][2 4][2 3]]
[[1 2][4 5][2 5][3 4][1 3][2 4][2 3][4 5][3 4]]
[[1 3][2 4][1 2][3 5][1 3][2 4][2 3][4 5][3 4]]
[[1 3][2 4][1 2][3 5][2 3][4 5][1 2][3 4][2 3]]
[[1 3][2 4][1 2][4 5][1 4][2 3][2 4][3 5][3 4]]
[[1 3][2 4][1 2][4 5][2 4][3 5][1 2][3 4][2 3]]
[[1 3][2 4][1 4][2 5][1 2][3 5][2 3][4 5][3 4]]
[[1 3][2 4][1 4][3 5][2 3][4 5][1 2][3 4][2 3]]
[[1 3][2 4][1 5][2 3][1 2][4 5][2 4][3 5][3 4]]
[[1 3][2 4][1 5][3 4][1 2][3 5][2 3][4 5][3 4]]
[[1 3][2 4][1 5][3 4][2 3][4 5][1 2][3 4][2 3]]
[[1 3][2 4][2 3][4 5][1 4][3 5][1 2][3 4][2 3]]
[[1 3][2 4][2 5][3 4][1 2][3 5][2 3][4 5][3 4]]
[[1 3][2 4][2 5][3 4][1 3][4 5][1 2][3 4][2 3]]
[[1 3][2 5][1 2][3 4][1 3][2 5][2 3][4 5][3 4]]
[[1 3][2 5][1 2][3 4][2 3][4 5][1 2][3 4][2 3]]
[[1 3][2 5][1 2][4 5][1 4][2 3][2 4][3 5][3 4]]
[[1 3][2 5][1 2][4 5][2 4][3 5][1 2][3 4][2 3]]
[[1 3][2 5][1 4][2 3][1 2][4 5][2 4][3 5][3 4]]
[[1 3][2 5][1 4][3 5][1 2][3 4][2 3][4 5][3 4]]
[[1 3][2 5][1 4][3 5][2 3][4 5][1 2][3 4][2 3]]
[[1 3][2 5][1 5][2 4][1 2][3 4][2 3][4 5][3 4]]
[[1 3][2 5][1 5][3 4][2 3][4 5][1 2][3 4][2 3]]
[[1 3][2 5][2 3][4 5][1 4][3 5][1 2][3 4][2 3]]
[[1 3][2 5][2 4][3 5][1 2][3 4][2 3][4 5][3 4]]
[[1 3][2 5][2 4][3 5][1 3][4 5][1 2][3 4][2 3]]
[[1 3][4 5][1 2][3 4][1 3][2 5][2 3][4 5][3 4]]
[[1 3][4 5][1 2][3 5][1 4][2 3][2 4][3 5][3 4]]
[[1 3][4 5][1 2][3 5][2 5][3 4][1 3][2 4][2 3]]
[[1 3][4 5][1 4][2 3][1 2][4 5][2 4][3 5][3 4]]
[[1 3][4 5][1 4][2 3][2 4][3 5][1 2][3 4][2 3]]
[[1 3][4 5][1 4][2 5][1 2][3 4][2 3][4 5][3 4]]
[[1 3][4 5][1 4][2 5][2 4][3 5][1 2][3 4][2 3]]
[[1 3][4 5][1 5][2 3][2 4][3 5][1 2][3 4][2 3]]
[[1 3][4 5][1 5][2 4][1 2][3 4][2 3][4 5][3 4]]
[[1 3][4 5][2 4][3 5][1 2][3 4][2 3][4 5][3 4]]
[[1 3][4 5][2 4][3 5][1 3][4 5][1 2][3 4][2 3]]
[[1 3][4 5][2 5][3 4][1 2][4 5][1 3][2 4][2 3]]
[[1 4][2 3][1 2][3 5][1 3][2 4][2 3][4 5][3 4]]
[[1 4][2 3][1 2][3 5][2 3][4 5][1 2][3 4][2 3]]
[[1 4][2 3][1 2][4 5][1 4][2 3][2 4][3 5][3 4]]
[[1 4][2 3][1 2][4 5][2 4][3 5][1 2][3 4][2 3]]
[[1 4][2 3][1 3][2 5][1 2][4 5][2 4][3 5][3 4]]
[[1 4][2 3][1 3][4 5][2 4][3 5][1 2][3 4][2 3]]
[[1 4][2 3][1 5][2 4][1 2][3 5][2 3][4 5][3 4]]
[[1 4][2 3][1 5][3 4][1 2][3 5][2 3][4 5][3 4]]
[[1 4][2 3][1 5][3 4][2 3][4 5][1 2][3 4][2 3]]
[[1 4][2 3][2 4][3 5][1 3][4 5][1 2][3 4][2 3]]
[[1 4][2 3][2 5][3 4][1 2][3 5][2 3][4 5][3 4]]
[[1 4][2 3][2 5][3 4][1 3][4 5][1 2][3 4][2 3]]
[[1 4][2 5][1 2][3 4][1 3][2 5][2 3][4 5][3 4]]
[[1 4][2 5][1 2][3 4][2 3][4 5][1 2][3 4][2 3]]
[[1 4][2 5][1 2][3 5][1 3][2 4][2 3][4 5][3 4]]
[[1 4][2 5][1 2][3 5][2 3][4 5][1 2][3 4][2 3]]
[[1 4][2 5][1 3][2 4][1 2][3 5][2 3][4 5][3 4]]
[[1 4][2 5][1 3][4 5][1 2][3 4][2 3][4 5][3 4]]
[[1 4][2 5][1 3][4 5][2 4][3 5][1 2][3 4][2 3]]
[[1 4][2 5][1 5][2 3][1 2][3 4][2 3][4 5][3 4]]
[[1 4][2 5][1 5][3 4][2 3][4 5][1 2][3 4][2 3]]
[[1 4][2 5][2 3][4 5][1 2][3 4][2 3][4 5][3 4]]
[[1 4][2 5][2 3][4 5][1 4][3 5][1 2][3 4][2 3]]
[[1 4][2 5][2 4][3 5][1 3][4 5][1 2][3 4][2 3]]
[[1 4][3 5][1 2][3 4][1 3][2 5][2 3][4 5][3 4]]
[[1 4][3 5][1 2][4 5][1 3][2 4][2 3][4 5][3 4]]
[[1 4][3 5][1 2][4 5][2 5][3 4][1 3][2 4][2 3]]
[[1 4][3 5][1 3][2 4][1 2][3 5][2 3][4 5][3 4]]
[[1 4][3 5][1 3][2 4][2 3][4 5][1 2][3 4][2 3]]
[[1 4][3 5][1 3][2 5][1 2][3 4][2 3][4 5][3 4]]
[[1 4][3 5][1 3][2 5][2 3][4 5][1 2][3 4][2 3]]
[[1 4][3 5][1 5][2 3][1 2][3 4][2 3][4 5][3 4]]
[[1 4][3 5][1 5][2 4][2 3][4 5][1 2][3 4][2 3]]
[[1 4][3 5][2 3][4 5][1 2][3 4][2 3][4 5][3 4]]
[[1 4][3 5][2 3][4 5][1 4][3 5][1 2][3 4][2 3]]
[[1 4][3 5][2 5][3 4][1 2][4 5][1 3][2 4][2 3]]
[[1 5][2 3][1 2][3 4][1 3][2 5][2 3][4 5][3 4]]
[[1 5][2 3][1 2][3 4][2 3][4 5][1 2][3 4][2 3]]
[[1 5][2 3][1 2][4 5][1 4][2 3][2 4][3 5][3 4]]
[[1 5][2 3][1 2][4 5][2 4][3 5][1 2][3 4][2 3]]
[[1 5][2 3][1 3][2 4][1 2][4 5][2 4][3 5][3 4]]
[[1 5][2 3][1 3][4 5][2 4][3 5][1 2][3 4][2 3]]
[[1 5][2 3][1 4][2 5][1 2][3 4][2 3][4 5][3 4]]
[[1 5][2 3][1 4][3 5][1 2][3 4][2 3][4 5][3 4]]
[[1 5][2 3][1 4][3 5][2 3][4 5][1 2][3 4][2 3]]
[[1 5][2 3][2 4][3 5][1 2][3 4][2 3][4 5][3 4]]
[[1 5][2 3][2 4][3 5][1 3][4 5][1 2][3 4][2 3]]
[[1 5][2 3][2 5][3 4][1 3][4 5][1 2][3 4][2 3]]
[[1 5][2 4][1 2][3 4][1 3][2 5][2 3][4 5][3 4]]
[[1 5][2 4][1 2][3 4][2 3][4 5][1 2][3 4][2 3]]
[[1 5][2 4][1 2][3 5][1 3][2 4][2 3][4 5][3 4]]
[[1 5][2 4][1 2][3 5][2 3][4 5][1 2][3 4][2 3]]
[[1 5][2 4][1 3][2 5][1 2][3 4][2 3][4 5][3 4]]
[[1 5][2 4][1 3][4 5][1 2][3 4][2 3][4 5][3 4]]
[[1 5][2 4][1 3][4 5][2 4][3 5][1 2][3 4][2 3]]
[[1 5][2 4][1 4][2 3][1 2][3 5][2 3][4 5][3 4]]
[[1 5][2 4][1 4][3 5][2 3][4 5][1 2][3 4][2 3]]
[[1 5][2 4][2 3][4 5][1 2][3 4][2 3][4 5][3 4]]
[[1 5][2 4][2 3][4 5][1 4][3 5][1 2][3 4][2 3]]
[[1 5][2 4][2 5][3 4][1 3][4 5][1 2][3 4][2 3]]
[[1 5][3 4][1 2][3 5][1 3][2 4][2 3][4 5][3 4]]
[[1 5][3 4][1 2][4 5][1 3][2 4][2 3][4 5][3 4]]
[[1 5][3 4][1 2][4 5][2 5][3 4][1 3][2 4][2 3]]
[[1 5][3 4][1 3][2 4][1 2][3 5][2 3][4 5][3 4]]
[[1 5][3 4][1 3][2 4][2 3][4 5][1 2][3 4][2 3]]
[[1 5][3 4][1 3][2 5][1 2][3 4][2 3][4 5][3 4]]
[[1 5][3 4][1 3][2 5][2 3][4 5][1 2][3 4][2 3]]
[[1 5][3 4][1 4][2 3][1 2][3 5][2 3][4 5][3 4]]
[[1 5][3 4][1 4][2 5][2 3][4 5][1 2][3 4][2 3]]
[[1 5][3 4][2 3][4 5][1 2][3 4][2 3][4 5][3 4]]
[[1 5][3 4][2 3][4 5][1 4][3 5][1 2][3 4][2 3]]
[[1 5][3 4][2 4][3 5][1 2][4 5][1 3][2 4][2 3]]
[[2 3][4 5][1 2][3 4][1 3][2 5][2 3][4 5][3 4]]
[[2 3][4 5][1 2][3 5][1 4][2 3][2 4][3 5][3 4]]
[[2 3][4 5][1 2][3 5][2 5][3 4][1 3][2 4][2 3]]
[[2 3][4 5][1 3][2 4][1 2][4 5][2 4][3 5][3 4]]
[[2 3][4 5][1 3][2 4][1 4][3 5][1 2][3 4][2 3]]
[[2 3][4 5][1 3][2 5][1 4][3 5][1 2][3 4][2 3]]
[[2 3][4 5][1 4][2 5][1 2][3 4][2 3][4 5][3 4]]
[[2 3][4 5][1 4][3 5][1 2][3 4][2 3][4 5][3 4]]
[[2 3][4 5][1 4][3 5][2 3][4 5][1 2][3 4][2 3]]
[[2 3][4 5][1 5][2 4][1 2][3 4][2 3][4 5][3 4]]
[[2 3][4 5][1 5][2 4][1 4][3 5][1 2][3 4][2 3]]
[[2 3][4 5][1 5][3 4][1 2][4 5][1 3][2 4][2 3]]
[[2 4][3 5][1 2][3 4][1 3][2 5][2 3][4 5][3 4]]
[[2 4][3 5][1 2][4 5][1 3][2 4][2 3][4 5][3 4]]
[[2 4][3 5][1 2][4 5][2 5][3 4][1 3][2 4][2 3]]
[[2 4][3 5][1 3][2 5][1 2][3 4][2 3][4 5][3 4]]
[[2 4][3 5][1 3][4 5][1 2][3 4][2 3][4 5][3 4]]
[[2 4][3 5][1 3][4 5][2 4][3 5][1 2][3 4][2 3]]
[[2 4][3 5][1 4][2 3][1 2][3 5][2 3][4 5][3 4]]
[[2 4][3 5][1 4][2 3][1 3][4 5][1 2][3 4][2 3]]
[[2 4][3 5][1 4][2 5][1 3][4 5][1 2][3 4][2 3]]
[[2 4][3 5][1 5][2 3][1 2][3 4][2 3][4 5][3 4]]
[[2 4][3 5][1 5][2 3][1 3][4 5][1 2][3 4][2 3]]
[[2 4][3 5][1 5][3 4][1 2][4 5][1 3][2 4][2 3]]
[[2 5][3 4][1 2][3 5][1 3][2 4][2 3][4 5][3 4]]
[[2 5][3 4][1 2][4 5][1 3][2 4][2 3][4 5][3 4]]
[[2 5][3 4][1 2][4 5][2 5][3 4][1 3][2 4][2 3]]
[[2 5][3 4][1 3][2 4][1 2][3 5][2 3][4 5][3 4]]
[[2 5][3 4][1 3][4 5][1 2][3 4][2 3][4 5][3 4]]
[[2 5][3 4][1 3][4 5][2 4][3 5][1 2][3 4][2 3]]
[[2 5][3 4][1 4][2 3][1 2][3 5][2 3][4 5][3 4]]
[[2 5][3 4][1 4][2 3][1 3][4 5][1 2][3 4][2 3]]
[[2 5][3 4][1 4][3 5][1 2][4 5][1 3][2 4][2 3]]
[[2 5][3 4][1 5][2 3][1 2][3 4][2 3][4 5][3 4]]
[[2 5][3 4][1 5][2 3][1 3][4 5][1 2][3 4][2 3]]
[[2 5][3 4][1 5][2 4][1 3][4 5][1 2][3 4][2 3]]
----------
- 6-input: 90 networks
[[1 2][3 4][5 6][1 3][2 5][4 6][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 2][3 4][5 6][1 3][2 6][4 5][1 4][2 3][5 6][2 4][3 5][3 4]]
[[1 2][3 4][5 6][1 4][2 6][3 5][1 3][2 5][4 6][2 3][4 5][3 4]]
[[1 2][3 4][5 6][1 5][2 3][4 6][1 2][3 6][4 5][2 4][3 5][3 4]]
[[1 2][3 4][5 6][1 5][2 4][3 6][1 3][2 5][4 6][2 3][4 5][3 4]]
[[1 2][3 4][5 6][1 6][2 4][3 5][1 3][2 5][4 6][2 3][4 5][3 4]]
[[1 2][3 5][4 6][1 3][2 4][5 6][1 2][3 5][4 6][2 3][4 5][3 4]]
[[1 2][3 5][4 6][1 3][2 6][4 5][1 4][2 3][5 6][2 4][3 5][3 4]]
[[1 2][3 5][4 6][1 4][2 3][5 6][1 2][3 6][4 5][2 4][3 5][3 4]]
[[1 2][3 5][4 6][1 4][2 5][3 6][1 3][2 4][5 6][2 3][4 5][3 4]]
[[1 2][3 5][4 6][1 5][2 6][3 4][1 3][2 4][5 6][2 3][4 5][3 4]]
[[1 2][3 5][4 6][1 6][2 5][3 4][1 3][2 4][5 6][2 3][4 5][3 4]]
[[1 2][3 6][4 5][1 3][2 4][5 6][1 2][3 5][4 6][2 3][4 5][3 4]]
[[1 2][3 6][4 5][1 3][2 5][4 6][1 4][2 3][5 6][2 4][3 5][3 4]]
[[1 2][3 6][4 5][1 4][2 3][5 6][1 2][3 6][4 5][2 4][3 5][3 4]]
[[1 2][3 6][4 5][1 4][2 6][3 5][1 3][2 4][5 6][2 3][4 5][3 4]]
[[1 2][3 6][4 5][1 5][2 6][3 4][1 3][2 4][5 6][2 3][4 5][3 4]]
[[1 2][3 6][4 5][1 6][2 5][3 4][1 3][2 4][5 6][2 3][4 5][3 4]]
[[1 3][2 4][5 6][1 2][3 5][4 6][1 3][2 4][5 6][2 3][4 5][3 4]]
[[1 3][2 4][5 6][1 2][3 6][4 5][1 4][2 3][5 6][2 4][3 5][3 4]]
[[1 3][2 4][5 6][1 4][2 5][3 6][1 2][3 5][4 6][2 3][4 5][3 4]]
[[1 3][2 4][5 6][1 5][2 3][4 6][1 2][3 6][4 5][2 4][3 5][3 4]]
[[1 3][2 4][5 6][1 5][2 6][3 4][1 2][3 5][4 6][2 3][4 5][3 4]]
[[1 3][2 4][5 6][1 6][2 5][3 4][1 2][3 5][4 6][2 3][4 5][3 4]]
[[1 3][2 5][4 6][1 2][3 4][5 6][1 3][2 5][4 6][2 3][4 5][3 4]]
[[1 3][2 5][4 6][1 2][3 6][4 5][1 4][2 3][5 6][2 4][3 5][3 4]]
[[1 3][2 5][4 6][1 4][2 3][5 6][1 2][3 6][4 5][2 4][3 5][3 4]]
[[1 3][2 5][4 6][1 4][2 6][3 5][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 3][2 5][4 6][1 5][2 4][3 6][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 3][2 5][4 6][1 6][2 4][3 5][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 3][2 6][4 5][1 2][3 4][5 6][1 3][2 5][4 6][2 3][4 5][3 4]]
[[1 3][2 6][4 5][1 2][3 5][4 6][1 4][2 3][5 6][2 4][3 5][3 4]]
[[1 3][2 6][4 5][1 4][2 3][5 6][1 2][3 6][4 5][2 4][3 5][3 4]]
[[1 3][2 6][4 5][1 4][2 5][3 6][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 3][2 6][4 5][1 5][2 4][3 6][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 3][2 6][4 5][1 6][2 4][3 5][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 4][2 3][5 6][1 2][3 5][4 6][1 3][2 4][5 6][2 3][4 5][3 4]]
[[1 4][2 3][5 6][1 2][3 6][4 5][1 4][2 3][5 6][2 4][3 5][3 4]]
[[1 4][2 3][5 6][1 3][2 5][4 6][1 2][3 6][4 5][2 4][3 5][3 4]]
[[1 4][2 3][5 6][1 5][2 4][3 6][1 2][3 5][4 6][2 3][4 5][3 4]]
[[1 4][2 3][5 6][1 5][2 6][3 4][1 2][3 5][4 6][2 3][4 5][3 4]]
[[1 4][2 3][5 6][1 6][2 5][3 4][1 2][3 5][4 6][2 3][4 5][3 4]]
[[1 4][2 5][3 6][1 2][3 4][5 6][1 3][2 5][4 6][2 3][4 5][3 4]]
[[1 4][2 5][3 6][1 2][3 5][4 6][1 3][2 4][5 6][2 3][4 5][3 4]]
[[1 4][2 5][3 6][1 3][2 4][5 6][1 2][3 5][4 6][2 3][4 5][3 4]]
[[1 4][2 5][3 6][1 3][2 6][4 5][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 4][2 5][3 6][1 5][2 3][4 6][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 4][2 5][3 6][1 6][2 3][4 5][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 4][2 6][3 5][1 2][3 4][5 6][1 3][2 5][4 6][2 3][4 5][3 4]]
[[1 4][2 6][3 5][1 2][3 6][4 5][1 3][2 4][5 6][2 3][4 5][3 4]]
[[1 4][2 6][3 5][1 3][2 4][5 6][1 2][3 5][4 6][2 3][4 5][3 4]]
[[1 4][2 6][3 5][1 3][2 5][4 6][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 4][2 6][3 5][1 5][2 3][4 6][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 4][2 6][3 5][1 6][2 3][4 5][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 5][2 3][4 6][1 2][3 4][5 6][1 3][2 5][4 6][2 3][4 5][3 4]]
[[1 5][2 3][4 6][1 2][3 6][4 5][1 4][2 3][5 6][2 4][3 5][3 4]]
[[1 5][2 3][4 6][1 3][2 4][5 6][1 2][3 6][4 5][2 4][3 5][3 4]]
[[1 5][2 3][4 6][1 4][2 5][3 6][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 5][2 3][4 6][1 4][2 6][3 5][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 5][2 3][4 6][1 6][2 4][3 5][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 5][2 4][3 6][1 2][3 4][5 6][1 3][2 5][4 6][2 3][4 5][3 4]]
[[1 5][2 4][3 6][1 2][3 5][4 6][1 3][2 4][5 6][2 3][4 5][3 4]]
[[1 5][2 4][3 6][1 3][2 5][4 6][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 5][2 4][3 6][1 3][2 6][4 5][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 5][2 4][3 6][1 4][2 3][5 6][1 2][3 5][4 6][2 3][4 5][3 4]]
[[1 5][2 4][3 6][1 6][2 3][4 5][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 5][2 6][3 4][1 2][3 5][4 6][1 3][2 4][5 6][2 3][4 5][3 4]]
[[1 5][2 6][3 4][1 2][3 6][4 5][1 3][2 4][5 6][2 3][4 5][3 4]]
[[1 5][2 6][3 4][1 3][2 4][5 6][1 2][3 5][4 6][2 3][4 5][3 4]]
[[1 5][2 6][3 4][1 3][2 5][4 6][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 5][2 6][3 4][1 4][2 3][5 6][1 2][3 5][4 6][2 3][4 5][3 4]]
[[1 5][2 6][3 4][1 6][2 3][4 5][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 6][2 3][4 5][1 2][3 4][5 6][1 3][2 5][4 6][2 3][4 5][3 4]]
[[1 6][2 3][4 5][1 2][3 5][4 6][1 4][2 3][5 6][2 4][3 5][3 4]]
[[1 6][2 3][4 5][1 3][2 4][5 6][1 2][3 6][4 5][2 4][3 5][3 4]]
[[1 6][2 3][4 5][1 4][2 5][3 6][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 6][2 3][4 5][1 4][2 6][3 5][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 6][2 3][4 5][1 5][2 4][3 6][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 6][2 4][3 5][1 2][3 4][5 6][1 3][2 5][4 6][2 3][4 5][3 4]]
[[1 6][2 4][3 5][1 2][3 6][4 5][1 3][2 4][5 6][2 3][4 5][3 4]]
[[1 6][2 4][3 5][1 3][2 5][4 6][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 6][2 4][3 5][1 3][2 6][4 5][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 6][2 4][3 5][1 4][2 3][5 6][1 2][3 5][4 6][2 3][4 5][3 4]]
[[1 6][2 4][3 5][1 5][2 3][4 6][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 6][2 5][3 4][1 2][3 5][4 6][1 3][2 4][5 6][2 3][4 5][3 4]]
[[1 6][2 5][3 4][1 2][3 6][4 5][1 3][2 4][5 6][2 3][4 5][3 4]]
[[1 6][2 5][3 4][1 3][2 4][5 6][1 2][3 5][4 6][2 3][4 5][3 4]]
[[1 6][2 5][3 4][1 3][2 6][4 5][1 2][3 4][5 6][2 3][4 5][3 4]]
[[1 6][2 5][3 4][1 4][2 3][5 6][1 2][3 5][4 6][2 3][4 5][3 4]]
[[1 6][2 5][3 4][1 5][2 3][4 6][1 2][3 4][5 6][2 3][4 5][3 4]]
лично я бы проверил, что сортировочная сеть правильна, прежде чем использовать ее, а не принимать слово какой-то случайной страницы в интернете. Грубая сила " только "требует запуска ее против конечного числа входов:" очевидно"n!
входов достаточно, и на самом деле это так 2**n
(https://en.wikipedia.org/wiki/Sorting_network#Zero-one_principle).
все оптимальные 5-сети включают "3" в последнем свопе, поэтому выбор медианы в меньшем количестве свопов не так просто, как все это. Однако это можно сделать в 6 сравнениях. Здесь больше кода, чем вам нужно, если вы можете игнорировать нытье по поводу вопроса:
код для вычисления "медианы пяти" в C#
чтобы выбрать медиану, вы не обязательно делаете любой свопы, кроме, возможно, одного безусловного свопа, если вы хотите сохранить все 5 значений. Шаг может быть адекватным.
asker был особенно заинтересован в реализации медианы-5 на основе сетей сортировки, поэтому я рассмотрю этот конкретный случай. Краткий обзор литературы показывает, как выглядят оптимальные решения в соответствии с различными метриками.
Майкл Кодиш, Луис Круз-Филипе, Торстен Элерс, Майк Мюллер и Питер Шнайдер-Камп. "Сортировка сетей: до конца и обратно."журнал компьютерных и системных наук (2016) в таблице 1 показывает, что для n=5, минимальное количество сравнительных свопов-9, а минимальная глубина сети-5. Поскольку каждый compare-swap эквивалентен двум операциям min/max, минимальное количество требуемых операций min / max-18.
Lukáŝ Sekanina, "эволюционный дизайн космонавтики для средней цепей". В:EvoWorkshops, March 2004, PP. 240-249, дает минимальное количество операций min / max, необходимых для оптимальной пятивходовой сети медианного выбора, как 10 в Таблица 1.
Уильям Гасарч, Уэйн Келли и Уильям пью. "Нахождение i-го наибольшего из n для малого i, n". новости ACM SIGACT 27, Нет. 2 (1996): 88-96, Таблица 1: для медианы 5 требуется не менее 6 сопоставлений.
В общем, сортировка сетей с минимальным количеством операций do не уменьшите к сетям медиан-выбора с минимальным количеством деятельностей просто исключением избыточных деятельностей. Но возможно найдите сети, которые оптимально уменьшаются хотя бы для некоторых значений n. Для n=5, поиск грубой силы для таких сетей возможен.
код ниже показан для четырех вариантов сетей сортировки с пятью входами, содержащих девять операций сравнения-свопа или, альтернативно, 18 операций min / max. При компиляции с FULL_SORT = 0
они превращаются в сети медианного выбора с операциями 10 min/max. Итак, согласно этой метрике, сортировка и медиана выбор оптимален.
однако, при использовании в качестве сетевого сортировки, все четыре варианта имеют глубину шесть, а не менее пяти. Кроме того, при настройке в качестве сети медианного выбора на основе сравнений вместо операций min / max требуется семь, а не минимум шесть сравнений.
пример компиляции результатов из Проводника компилятора (godbolt): использование 18 операций min / max для пяти входных вроде, через 10 мин / макс. операций для пяти входов в среднем.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define VARIANT 1
#define USE_MIN_MAX 1
#define FULL_SORT 0
typedef float T;
#if USE_MIN_MAX
#define MIN(a,b) ((T)(fmin(a,b)))
#define MAX(a,b) ((T)(fmax(a,b)))
#define SWAP(i,j) do { T s = MIN(a##i,a##j); T t = MAX(a##i,a##j); a##i = s; a##j = t; } while (0)
#else // USE_MIN_MAX
#define MIN(a,b) (((a) > (b)) ? (b) : (a))
#define MAX(a,b) (((a) > (b)) ? (a) : (b))
#define SWAP(i,j) do { if (a##i > a##j) { T temp = a##i; a##i = a##j; a##j = temp; }} while (0)
#endif // USE_MIN_MAX
/* Use sorting/median network to fully or partially sort array of five values
and return the median value
*/
T network5 (T *a)
{
// copy to scalars
T a0, a1, a2, a3, a4;
a0=a[0];a1=a[1];a2=a[2];a3=a[3];a4=a[4];
#if VARIANT == 1
SWAP (0, 1); SWAP (2, 3);
SWAP (0, 2); SWAP (1, 3);
SWAP (2, 1);
SWAP (1, 4);
SWAP (1, 2);
SWAP (0, 1); SWAP (3, 4);
#elif VARIANT == 2
SWAP (3, 4); SWAP (0, 2);
SWAP (2, 4); SWAP (0, 3);
SWAP (2, 3);
SWAP (1, 2);
SWAP (0, 1); SWAP (2, 3);
SWAP (3, 4);
#elif VARIANT == 3
SWAP (3, 2); SWAP (0, 4);
SWAP (2, 4); SWAP (0, 3);
SWAP (2, 3);
SWAP (1, 2);
SWAP (0, 1); SWAP (2, 3);
SWAP (3, 4);
#elif VARIANT == 4
SWAP (2, 4); SWAP (0, 1);
SWAP (0, 2); SWAP (1, 4);
SWAP (2, 3);
SWAP (1, 2);
SWAP (2, 3); SWAP (0, 1);
SWAP (3, 4);
#else
#error unsupported VARIANT
#endif
#if FULL_SORT
// copy back sorted results
a[0]=a0;a[1]=a1;a[2]=a2;a[3]=a3;a[4]=a4;
#endif
// return median-of-5
return a2;
}
слишком долго для комментария. Ответ профа Фолкена выше может быть проверен в MATLAB по следующим строкам: используя бит find/replacing или regex-fu, напишите
sn{3} = [...
[[1,2],[1,3],[2,3]];...
[[1,2],[2,3],[1,2]];...
[[1,3],[1,2],[2,3]];...
[[1,3],[2,3],[1,2]];...
[[2,3],[1,2],[2,3]];...
[[2,3],[1,3],[1,2]];
];
и аналогично для других значений n, затем запустить
for n = 3:6
test_in = cellfun(@str2num,num2cell(dec2bin(0:(2^n-1),n)));
for j = 1:size(sn{n},1)
test_out = test_in;
for k = 1:2:size(sn{n},2)
temp1 = test_out(:,sn{n}(j,k));
temp2 = test_out(:,sn{n}(j,k+1));
ind = temp2 < temp1;
test_out(ind,sn{n}(j,k)) = temp2(ind);
test_out(ind,sn{n}(j,k+1)) = temp1(ind);
end
end
test = cellfun(@issorted,mat2cell(test_out,ones(1,2^n),n));
assert(all(test),['n = ',num2str(n),' failed test']);
end
В утверждения для каждого значения n.