Как исправить этот нерекурсивный алгоритм сортировки нечетных и четных слияний?
Я искал нерекурсивный алгоритм сортировки нечетных и четных слияний и нашел 2 источника:
книга отСеджвик Р.этотТАК вопросОба алгоритма идентичны, но неверны. Результирующая сеть сортировки не является сеткой сортировки с нечетным четным слиянием.
Вот изображение результирующей сети с 32 входами. Вертикальная линия между двумя горизонтальными линиями означает сравнение значения a [x] с a [y], если оно больше, то поменять местами значения в массиве.
сортировка нечетно-четного слияния для 32 входов http://flylib.com/books/3/55/1/html/2/images/11fig07.gif (Кликабельно)
Я скопировал код с 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 для тестов на моей аппаратной платформе.
Другие реализации аппаратной сортировки с открытым исходным кодом:
PoC.sort.sortnet.oddevensortPoC.sort.sortnet.bitonicsortПриложение:
Нечетно-четная сортировка (сортировка a.k.a Batcher) подобна битонической сортировке (не путать с битонической сортировкой Batcher). Но в аппаратном обеспечении этот алгоритм имеет большую сложность по размеру, чем битовая сортировка, а задержка такая же.
Эти алгоритмы могут быть реализованы с хорошим использованием ресурсов по сравнению с быстрыми программными алгоритмами, такими как быстрая сортировка.
Википедия:нечетно-четный слияние
Замечания:
Поскольку сети сортировки являются статическими и не зависят от входных значений, для генерации сети не нужно сравнивать и менять местами. Это одна из причин, почему он может быть преобразован в аппаратное обеспечение. Мой код генерирует индексы для операций сравнения. В аппаратном обеспечении эти вертикальные соединения будут заменены схемами сравнения и обмена. Таким образом, несортированные данные будут проходить через сеть и на выходной стороне будут отсортированы.