Я искал нерекурсивен алгоритм нечетного четных сортировок слияния и найден 2 источников:Как исправить этот нерекурсивный алгоритм сортировки нечетных четных-слияний?
- книга из Sedgewick R.
- это SO question
Оба алгоритма являются идентичным, но неверно. Результирующая сеть сортировки не является сетью сортировки с нечетным четным соединением.
Вот изображение полученной сети с 32 входами. Вертикальная линия между двумя горизонтальными линиями означает сравнение значения a [x] с [y], если оно больше, а затем меняет значения в массиве.
odd-even-merge sort for 32 inputs 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 для испытаний на моей аппаратной платформе.
Другие реализации сортировки с открытым исходным кодом аппаратных средств сети:
Приложение:
нечетной даже слиянием (он же вроде Бэтчера), как bitonic сортировать (не путать с дозатором битонический сорт). Но в аппаратном обеспечении этот алгоритм имеет более сложную размерность, чем битническую сортировку, а латентность - то же самое.
Эти алгоритмы могут быть реализованы с хорошим использованием ресурсов по сравнению с быстрыми алгоритмами программного обеспечения, такими как quicksort.
Википедия: odd-even mergesort
Примечание:
Поскольку сортировочные сети являются статическими и не зависит от входных значений, не сравнить и обмен необходим для создания сети. Это одна из причин, почему она может быть преобразована в аппаратное обеспечение. Мой код генерирует индексы для операций сравнения. В аппаратных средствах эти вертикальные соединения будут заменены схемами сравнения и подкачки. Таким образом, несортированные данные будут перемещаться по сети, а на выходной стороне они будут отсортированы.
Не знаете, как сильно вы собираетесь быть на эффективность, но если конечный результат является точным, это действительно имеет значение, если он генерирует слишком много пар во время процесса? – MaxOvrdrv
ДА. В программном обеспечении он генерирует массу операций сравнения с большим загрязнением кеша. В аппаратных средствах увеличивается потребление и латентность площади. Обычно сортировка нечетно-четного слияния имеет сложность размера O (N * log N * log N). Моя диаграмма выглядит как N^3. – Paebbels
Я не понимаю: что вам не нравится в текущем алгоритме? Почему вы утверждаете, что генерирует слишком много пар? Есть ли определенная пара, которую вы уверены, не нужна? Что такое сортировка с нечетным четным? –