public class MergeSort { private static final int LENGTH = 512; private final int[] ar = new int[LENGTH]; private final int[] tmp = new int[LENGTH]; public synchronized void init() { for (int i = 0; i < ar.length; i++) { ar[i] = ar.length - 1 - i; } } public synchronized void set(int id, int data) { ar[id] = data; } public synchronized int get(int id) { return ar[id]; } public boolean check() { int v = ar[0]; for (int i = 1; i < ar.length; i++) { if(v > ar[i]) return false; v = ar[i]; } return true; } private int min(int a, int b){ if(a < b){ return a; }else{ return b; } } public synchronized void test() { int div, seg, fb, fe, sb, se, i, j, n, p; for (div = 1; div <= LENGTH; div = div << 1) { for (seg = 0; seg < LENGTH; seg = seg + (div << 1)) { n = seg; fb = n; fe = min(fb + div, LENGTH); sb = fe; se = min(sb + div, LENGTH); i = fb; j = sb; while (i < fe && j < se) { int a0 = ar[i]; int a1 = ar[j]; if (a0 <= a1) { tmp[n] = a0; i++; } else { tmp[n] = a1; j++; } n++; } while (i < fe) { tmp[n] = ar[i]; n++; i++; } while (j < se) { tmp[n] = ar[j]; n++; j++; } for (p = seg; p < n; ++p) { ar[p] = tmp[p]; } } } } }