In Java 8, you can use your sort method to interface functions. This is the modified code from OpenJDK (Copyright 1997-2007 Sun Microsystems, Inc. GPLv2 ):
import java.util.function.LongBinaryOperator; public class ArraySort { public static void sort(long[] x, LongBinaryOperator op) { sort1(x, 0, x.length, op); } private static void sort1(long x[], int off, int len, LongBinaryOperator op) { if (len < 7) { for (int i=off; i<len+off; i++) // Use custom comparator for insertion sort fallback for (int j=i; j>off && (op.applyAsLong(x[j-1], x[j]) > 0); j--) swap(x, j, j-1); return; } int m = off + (len >> 1); if (len > 7) { int l = off; int n = off + len - 1; if (len > 40) { int s = len/8; l = med3(x, l, l+s, l+2*s); m = med3(x, ms, m, m+s); n = med3(x, n-2*s, ns, n); } m = med3(x, l, m, n); } long v = x[m]; int a = off, b = a, c = off + len - 1, d = c; while(true) { // Use custom comparator for checking elements while (b <= c && (op.applyAsLong(x[b], v) <= 0)) { if (x[b] == v) swap(x, a++, b); b++; } // Use custom comparator for checking elements while (c >= b && (op.applyAsLong(x[c], v) >= 0)) { if (x[c] == v) swap(x, c, d--); c--; } if (b > c) break; swap(x, b++, c--); } int s, n = off + len; s = Math.min(a-off, ba ); vecswap(x, off, bs, s); s = Math.min(dc, nd-1); vecswap(x, b, ns, s); if ((s = ba) > 1) sort1(x, off, s, op); if ((s = dc) > 1) sort1(x, ns, s, op); } private static void swap(long x[], int a, int b) { long t = x[a]; x[a] = x[b]; x[b] = t; } private static void vecswap(long x[], int a, int b, int n) { for (int i=0; i<n; i++, a++, b++) swap(x, a, b); } private static int med3(long x[], int a, int b, int c) { return (x[a] < x[b] ? (x[b] < x[c] ? b : x[a] < x[c] ? c : a) : (x[b] > x[c] ? b : x[a] > x[c] ? c : a)); } }
And call it using lambdas or something else that implements the LongBinaryOperator interface:
import java.util.Arrays; public class Main { public static void main(String[] args) { long x[] = {5, 5, 7, 1, 2, 5, 8, 9, 23, 5, 32, 45, 76}; ArraySort.sort(x, (a, b) -> b - a);
Output:
[76, 45, 32, 23, 9, 8, 7, 5, 5, 5, 5, 2, 1]