I have an [] that has some numbers (distances from some point).
I want to create an array of indexes into the first array where the indexes are sorted by the distance.>
Works well if you want the indicies as a primative int array then you will have to create your own binary sorter which shouldn't be to difficult.
Edit: I adapted java's mergesorter to work with int's. This should save you a little time in writing your own.
public static void main(String[] args) {
double[] dist = new double[] {3.2, 1.4, 7.3, 2.2, 9.1};
int[] indices = createIndicies(dist);
System.out.println(Arrays.toString(dist) + " " + Arrays.toString(indices));
}
public static int[] createIndicies(double[] array) {
int[] intArray = new int[array.length];
for (int j = 0; j < array.length; j++) {
intArray[j] = j;
}
int[] indicies = intArray.clone();
mergeSort(intArray, indicies, 0, intArray.length, 0, new IndiciesSorter(array));
return indicies;
}
public static class IndiciesSorter implements Comparator {
double[] array;
public IndiciesSorter(double[] array) {
this.array = array;
}
@Override
public int compare(Integer o1, Integer o2) {
return Double.compare(array[o1], array[o2]);
}
}
private static void mergeSort(int[] src, int[] dest, int low,
int high, int off, Comparator c) {
int length = high - low;
// Insertion sort on smallest arrays
if (length < 7) {
for (int i = low; i < high; i++)
for (int j = i; j > low && c.compare(dest[j - 1], dest[j]) > 0; j--)
swap(dest, j, j - 1);
return;
}
// Recursively sort halves of dest into src
int destLow = low;
int destHigh = high;
low += off;
high += off;
int mid = (low + high) >>> 1;
mergeSort(dest, src, low, mid, -off, c);
mergeSort(dest, src, mid, high, -off, c);
// If list is already sorted, just copy from src to dest. This is an
// optimization that results in faster sorts for nearly ordered lists.
if (c.compare(src[mid - 1], src[mid]) <= 0) {
System.arraycopy(src, low, dest, destLow, length);
return;
}
// Merge sorted halves (now in src) into dest
for (int i = destLow, p = low, q = mid; i < destHigh; i++) {
if (q >= high || p < mid && c.compare(src[p], src[q]) <= 0)
dest[i] = src[p++];
else
dest[i] = src[q++];
}
}
private static void swap(int[] x, int a, int b) {
int t = x[a];
x[a] = x[b];
x[b] = t;
}