Вы можете использовать любой алгоритм сортировки над places
, но вместо сравнения places
сравните scores
, индексированный как places
.
Вот модифицированный quickSort
:
static int partition(int[] iarray, int[] varray, int begin, int end) {
int pivot = end;
int counter = begin;
for (int i = begin; i < end; i++) {
if (varray[iarray[i]] < varray[iarray[pivot]]) {
int temp = iarray[counter];
iarray[counter] = iarray[i];
iarray[i] = temp;
counter++;
}
}
int temp = iarray[pivot];
iarray[pivot] = iarray[counter];
iarray[counter] = temp;
return counter;
}
public static void quickSort(int[] iarray, int[] varray, int begin, int end) {
if (end <= begin) return;
int pivot = partition(iarray, varray, begin, end);
quickSort(iarray, varray, begin, pivot - 1);
quickSort(iarray, varray, pivot + 1, end);
}
Единственное изменение - добавить аргумент varray
и сравнение iarray[i] < iarray[pivot]
с varray[iarray[i]] < varray[iarray[pivot]]
.
ПРИМЕЧАНИЕ: места должны быть числами от 0
в n - 1
.
Если places
являются ключами вместо индексов, вам необходим промежуточный Map
для преобразования varray[iarray[i]]
в varray[real_index_of.get(iarray[i])]
.
Примером работы может быть:
int[] scores = new int[]{5, 7, 10, 3, 6};
int[] places = new int[]{0, 1, 2, 3, 4};
quickSort(places, scores, 0, places.length - 1);
System.out.println(Arrays.stream(scores).mapToObj(Integer::toString).collect(joining(", ")));
System.out.println(Arrays.stream(places).mapToObj(Integer::toString).collect(joining(", ")));
С выводом:
5, 7, 10, 3, 6
3, 0, 4, 1, 2
(ваш вывод неверен, поскольку 5
является вторым наименьшим значением)