Я искал нерекурсивный алгоритм сортировки нечетных и четных слияний и нашел 2 источника:
- книга от Седжвика Р.
- этот такой вопрос
Оба алгоритма идентичны, но неверны. Результирующая сеть сортировки не является сеткой сортировки с нечетным четным слиянием.
Вот изображение результирующей сети с 32 входами. Вертикальная линия между двумя горизонтальными линиями означает сравнение значения a [x] с a [y], если оно больше, то поменять местами значения в массиве.
(источник: flylib.com)
(Интерактивный)
Я скопировал код с Java на C и заменил функцию exch
на printf
для печати кандидатов на обмен.
Когда вы рисуете диаграмму пар, можно увидеть, что генерируется слишком много пар.
Кто-нибудь знает, как исправить этот алгоритм?
Зачем мне нужна нерекурсивная версия?
Я хочу превратить эту сортировочную сеть в аппаратное обеспечение. Легко вставить этапы конвейера в нерекурсивные алгоритмы.
Я также исследовал рекурсивную версию, но она слишком сложна для преобразования алгоритма в конвейерное оборудование.
Мой код C:
#include <stdlib.h>
#include <stdio.h>
void sort(int l, int r)
{ int n = r-l+1;
for (int p=1; p<n; p+=p)
for (int k=p; k>0; k/=2)
for (int j=k%p; j+k<n; j+=(k+k))
for (int i=0; i<n-j-k; i++)
if ((j+i)/(p+p) == (j+i+k)/(p+p))
printf("%2i cmp %2i\n", l+j+i, l+j+i+k);
}
int main(char* argv, int args)
{ const int COUNT = 8;
sort(0, COUNT);
}
Результат:
0 -o--------o-------------------------o---------------o-------------------------
| | | |
1 -o--------|-o------o----------------|-o-------------o-o-----------------------
| | | | | |
2 -o-o------o-|------o-o--------------|-|-o----o--------o-o---------------------
| | | | | | | | |
3 -o-o--------o--------o--------------|-|-|-o--|-o--------o-o-------o-----------
| | | | | | | |
4 -o-o-o----o---o----o-----o----------o-|-|-|--o-|-o--------o-o-----o-o---------
| | | | | | | | | | | | | |
5 -o-o-o----|-o-|-o--o-o---o-o---o------o-|-|----o-|-o--------o-o-----o-o---o---
| | | | | | | | | | | | | |
6 -o-o-o-o--o-|-o-|----o-o---o-o-o-o------o-|------o-|----------o-o-----o-o-o-o-
| | | | | | | | | | | | | |
7 -o-o-o-o----o---o------o-----o---o--------o--------o------------o-------o---o-
Когда я узнаю правильные пары обмена и алгоритм будет соответствовать изображению, я переведу его в VHDL для тестов на моей аппаратной платформе.
Другие реализации аппаратной сортировки с открытым исходным кодом:
Приложение:
Нечетно-четная сортировка слиянием (a.k.a сортировка дозатора) похожа на битоническую сортировку (не путать с битронной сортировкой дозирования). Но в аппаратном обеспечении этот алгоритм имеет большую сложность по размеру, чем битовая сортировка, а задержка такая же.
Эти алгоритмы могут быть реализованы с хорошим использованием ресурсов по сравнению с быстрыми программными алгоритмами, такими как быстрая сортировка.
Википедия: нечетно-четное слияние
Примечание:
Поскольку сети сортировки являются статическими и не зависят от входных значений, для генерации сети не нужно сравнивать и менять местами. Это одна из причин, почему он может быть преобразован в аппаратное обеспечение. Мой код генерирует индексы для операций сравнения. В аппаратном обеспечении эти вертикальные соединения будут заменены схемами сравнения и обмена. Таким образом, несортированные данные будут проходить через сеть и на выходной стороне будут отсортированы.