package studio.kdb; public class Sorter { static public void sort(boolean a[], int lo, int hi, int permutation[], int scratch[]) { if (lo >= hi) return; int mid = (lo + hi) / 2; sort(a,lo,mid,permutation,scratch); sort(a,mid + 1,hi,permutation,scratch); int k, t_lo = lo, t_hi = mid + 1; for (k = lo;k <= hi;k++) if ((t_lo <= mid) && ((t_hi > hi) || ((a[permutation[t_lo]] ? 1 : 0) <= (a[permutation[t_hi]] ? 1 : 0)))) scratch[k] = permutation[t_lo++]; else scratch[k] = permutation[t_hi++]; System.arraycopy(scratch,lo,permutation,lo,1 + hi - lo); } static public void sort(String a[], int lo, int hi, int permutation[], int scratch[]) { if (lo >= hi) return; int mid = (lo + hi) / 2; sort(a,lo,mid,permutation,scratch); sort(a,mid + 1,hi,permutation,scratch); int k, t_lo = lo, t_hi = mid + 1; for (k = lo;k <= hi;k++) if ((t_lo <= mid) && ((t_hi > hi) || (a[permutation[t_lo]].compareTo(a[permutation[t_hi]]) <= 0))) scratch[k] = permutation[t_lo++]; else scratch[k] = permutation[t_hi++]; System.arraycopy(scratch,lo,permutation,lo,1 + hi - lo); } static public void sort(char a[], int lo, int hi, int permutation[], int scratch[]) { if (lo >= hi) return; int mid = (lo + hi) / 2; sort(a,lo,mid,permutation,scratch); sort(a,mid + 1,hi,permutation,scratch); int k, t_lo = lo, t_hi = mid + 1; for (k = lo;k <= hi;k++) if ((t_lo <= mid) && ((t_hi > hi) || (a[permutation[t_lo]] <= a[permutation[t_hi]]))) scratch[k] = permutation[t_lo++]; else scratch[k] = permutation[t_hi++]; System.arraycopy(scratch,lo,permutation,lo,1 + hi - lo); } static public void sort(byte a[], int lo, int hi, int permutation[], int scratch[]) { if (lo >= hi) return; int mid = (lo + hi) / 2; sort(a,lo,mid,permutation,scratch); sort(a,mid + 1,hi,permutation,scratch); int k, t_lo = lo, t_hi = mid + 1; for (k = lo;k <= hi;k++) if ((t_lo <= mid) && ((t_hi > hi) || (a[permutation[t_lo]] <= a[permutation[t_hi]]))) scratch[k] = permutation[t_lo++]; else scratch[k] = permutation[t_hi++]; System.arraycopy(scratch,lo,permutation,lo,1 + hi - lo); } static public void sort(short a[], int lo, int hi, int permutation[], int scratch[]) { if (lo >= hi) return; int mid = (lo + hi) / 2; sort(a,lo,mid,permutation,scratch); sort(a,mid + 1,hi,permutation,scratch); int k, t_lo = lo, t_hi = mid + 1; for (k = lo;k <= hi;k++) if ((t_lo <= mid) && ((t_hi > hi) || (a[permutation[t_lo]] <= a[permutation[t_hi]]))) scratch[k] = permutation[t_lo++]; else scratch[k] = permutation[t_hi++]; System.arraycopy(scratch,lo,permutation,lo,1 + hi - lo); } static public void sort(long a[], int lo, int hi, int permutation[], int scratch[]) { if (lo >= hi) return; int mid = (lo + hi) / 2; sort(a,lo,mid,permutation,scratch); sort(a,mid + 1,hi,permutation,scratch); int k, t_lo = lo, t_hi = mid + 1; for (k = lo;k <= hi;k++) if ((t_lo <= mid) && ((t_hi > hi) || (a[permutation[t_lo]] <= a[permutation[t_hi]]))) scratch[k] = permutation[t_lo++]; else scratch[k] = permutation[t_hi++]; System.arraycopy(scratch,lo,permutation,lo,1 + hi - lo); } static public void sort(float a[], int lo, int hi, int permutation[], int scratch[]) { if (lo >= hi) return; int mid = (lo + hi) / 2; sort(a,lo,mid,permutation,scratch); sort(a,mid + 1,hi,permutation,scratch); int k, t_lo = lo, t_hi = mid + 1; for (k = lo;k <= hi;k++) if ((t_lo <= mid) && ((t_hi > hi) || (Float.isNaN(a[permutation[t_lo]])) || (a[permutation[t_lo]] <= a[permutation[t_hi]]))) scratch[k] = permutation[t_lo++]; else scratch[k] = permutation[t_hi++]; System.arraycopy(scratch,lo,permutation,lo,1 + hi - lo); } static public void sort(double a[], int lo, int hi, int permutation[], int scratch[]) { if (lo >= hi) return; int mid = (lo + hi) / 2; sort(a,lo,mid,permutation,scratch); sort(a,mid + 1,hi,permutation,scratch); int k, t_lo = lo, t_hi = mid + 1; for (k = lo;k <= hi;k++) if ((t_lo <= mid) && ((t_hi > hi) || (Double.isNaN(a[permutation[t_lo]])) || (a[permutation[t_lo]] <= a[permutation[t_hi]]))) scratch[k] = permutation[t_lo++]; else scratch[k] = permutation[t_hi++]; System.arraycopy(scratch,lo,permutation,lo,1 + hi - lo); } static public void sort(int a[], int lo, int hi, int permutation[], int scratch[]) { if (lo >= hi) return; int mid = (lo + hi) / 2; sort(a,lo,mid,permutation,scratch); sort(a,mid + 1,hi,permutation,scratch); int k, t_lo = lo, t_hi = mid + 1; for (k = lo;k <= hi;k++) if ((t_lo <= mid) && ((t_hi > hi) || (a[permutation[t_lo]] <= a[permutation[t_hi]]))) scratch[k] = permutation[t_lo++]; else scratch[k] = permutation[t_hi++]; System.arraycopy(scratch,lo,permutation,lo,1 + hi - lo); } public static int[] gradeUp(Object data,int length) { //int length= Array.getLength(data); int[] scratch = new int[length]; int[] permutation = new int[length]; for (int i = 0;i < permutation.length;i++) permutation[i] = i; if (data instanceof int[]) sort((int[]) data,0,length - 1,permutation,scratch); else if (data instanceof boolean[]) sort((boolean[]) data,0,length - 1,permutation,scratch); else if (data instanceof double[]) sort((double[]) data,0,length - 1,permutation,scratch); else if (data instanceof float[]) sort((float[]) data,0,length - 1,permutation,scratch); else if (data instanceof long[]) sort((long[]) data,0,length - 1,permutation,scratch); else if (data instanceof short[]) sort((short[]) data,0,length - 1,permutation,scratch); else if (data instanceof char[]) sort((char[]) data,0,length - 1,permutation,scratch); else if (data instanceof byte[]) sort((byte[]) data,0,length - 1,permutation,scratch); else if (data instanceof String[]) sort((String[]) data,0,length - 1,permutation,scratch); return permutation; } public static int[] reverse(int[] a) { int temp; for (int i = 0;i < a.length / 2;i++) { temp = a[i]; a[i] = a[a.length - i - 1]; a[a.length - i - 1] = temp; } return a; } public static int[] gradeDown(Object data,int length) { return reverse(gradeUp(data,length)); } }