Bitonik saralash (Bitonic sort). Massiv elementlarini paralel saralash algoritmi bo‘lib, tarmoqlarda foydalaniladi. Bu algoritmning g‘oyasi shundan iboratki, massiv Biton ketma – ketlikka-avval ortib, keyin kamayib boradigan ketma-ketlikka aylanadi. Buni quyidagicha samarali tartiblashtirish mumkin: massivni ikki qismga ajratiladi, ikkita massiv yaratiladi, barcha elementlarni ikki qismdan har bir tegishli elementlar birinchi massivga minimal va ikkinchisiga maksimal teng qo‘shiladi. Ikkita Biton ketma-ketlik olinishi, ularning har birini bir xil usulda rekursiv ravishda tartiblash mumkin, so‘ngra ikkita massivni birlashtirish mumkin (birinchisining har qaysi elementi ikkinchisining har qaysi elementidan kam yoki teng bo‘lganligi uchun). Massivini Biton ketma-ketlikka aylantirish uchun quyidagilarni bajarish lozim: agar massiv ikki elementdan iborat bo‘lsa, uni shunchaki bajarish mumkin, aks holda massivni ikkiga ajratib, algoritmni bo‘lak massivlardan rekursiv chaqiriladi, keyin birinchi qismini tartib bilan, ikkinchisini teskari tartibda saralab, bir-biriga birlashtiriladi. Shubhasiz, natijada bitonal ketma-ketlikni olanadi. Murakkabligi O(nlog2n), chunki Biton ketma-ketligini qurishda O(nlogn) uchun ishlaydigan tartiblashlardan foydalandik va darajalarning umumiy soni logn edi. Bundan tashqari, massiv hajmi ikkining darajasiga karrali bo‘lishi kerak, shuningdek, elementlar bilan to‘ldirish kerak bo‘lishi mumkin.
8.15-dastur. Saralashni amalga oshirish.
void bitseqsort(int* l, int* r, bool inv) { if (r - l <= 1) return;
int *m = l + (r - l) / 2;
for (int *i = l, *j = m; i < m && j < r; i++, j++) { if (inv ^ (*i > *j)) swap(*i, *j);
}
bitseqsort(l, m, inv); bitseqsort(m, r, inv);
}
void makebitonic(int* l, int* r) { if (r - l <= 1) return;
int *m = l + (r - l) / 2; makebitonic(l, m); bitseqsort(l, m, 0); makebitonic(m, r); bitseqsort(m, r, 1);
}
void bitonicsort(int* l, int* r) {
int n = 1;
int inf = *max(l, r) + 1; while (n < r - l) n *= 2; int* a = new int[n];
int cur = 0;
for (int *i = l; i < r; i++) a[cur++] = *i;
while (cur < n) a[cur++] = inf; makebitonic(a, a + n); bitseqsort(a, a + n, 0);
cur = 0;
for (int *i = l; i < r; i++)
*i = a[cur++]; delete a;
}