Как исправить этот нерекурсивный алгоритм сортировки нечетных и четных слияний?

Я искал нерекурсивный алгоритм сортировки нечетных и четных слияний и нашел 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). Но в аппаратном обеспечении этот алгоритм имеет большую сложность по размеру, чем битовая сортировка, а задержка такая же.

Эти алгоритмы могут быть реализованы с хорошим использованием ресурсов по сравнению с быстрыми программными алгоритмами, такими как быстрая сортировка.

Википедия:нечетно-четный слияние

Замечания:
Поскольку сети сортировки являются статическими и не зависят от входных значений, для генерации сети не нужно сравнивать и менять местами. Это одна из причин, почему он может быть преобразован в аппаратное обеспечение. Мой код генерирует индексы для операций сравнения. В аппаратном обеспечении эти вертикальные соединения будут заменены схемами сравнения и обмена. Таким образом, несортированные данные будут проходить через сеть и на выходной стороне будут отсортированы.

Ответы на вопрос(3)

Ваш ответ на вопрос