Используйте любой стандартный алгоритм сортировки.
К примеру есть у вас QuickSort
(Если не знаете, это такой быстрый алгоритм для сортировки (Сложность N*log N))
Взял на С++ что писал когда-то:

Код:
Quick(int b, int e)
{
int i=b, j=e;
int X = ar[(b+e) / 2]; // Здесь надо выбрать любой элемент массива.
while (i<=j) {
while (ar[i] < X) i++;
while (ar[j] > X) j--;
if (i<=j) {
int tmp = ar[i];
ar[i] = ar[j];
ar[j] = tmp;
i++;
j--;
}
}
if (i<e) Quick(i, e);
if (b<j) Quick(b, j);
}
Этот алгоритм отсортирует массив ar, начиная с индекса b до e включительно
То есть вызывать функцию надо так:
Quick(0, a1.length-1); // Если взять ваш пример
Но вам нужно, насколько я понимаю, чтобы сохранились относительные позиции другого массива. Что ж, надо просто элементы другого массива менять аналогично первому, получим что-то вроде этого: (Type - тип элементов в другом массиве)

Код:
Quick(int b, int e)
{
int i=b, j=e;
int X = ar[(b+e) / 2]; // Здесь надо выбрать любой элемент массива.
while (i<=j) {
while (ar[i] < X) i++;
while (ar[j] > X) j--;
if (i<=j) {
int tmp = ar[i];
ar[i] = ar[j];
ar[j] = tmp;
Type tmp1 = ar1[i];
ar1[i] = ar1[j];
ar1[j] = tmp1;
i++;
j--;
}
}
if (i<e) Quick(i, e);
if (b<j) Quick(b, j);
}