Привет, у меня есть вопрос о нечетно-четном слиянии Бэтчера. У меня есть следующий код:
public class Batcher {
public static void batchsort(int a[], 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))
exch(a, l+j+i, l+j+i+k);
}
public static void main(String[] args) {
int a[] = new int[] {2, 4, 3, 4, 6, 5, 3};
batchsort(a, 0, a.length - 1);
for (int i=0; i<a.length; i++) {
System.out.println(a[i]);
}
}
public static void exch(int a[], int i, int j) {
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}
Я приведу несколько комментариев о функции кода:
Он делится на фазы, индексируемые переменной p
, последняя фаза - это когда p==n
- это дозаторы нечетно-четное слияние следующая фаза - это когда p==n/2
нечетно-четное слияние с Первая стадия и все компараторы, которые пересекают n / 2, исключают третью-последнюю фазу, когда p==n/4
нечетно-четное слияние с первыми двумя стадиями и все компараторы, которые пересекают любое кратное число n / 4, исключаются и так далее.
Результаты:
3
3
4
4
5
2
6
Что я пропустил?
Что не так?