Похоже для решения такой задачи проще использовать дополнительную память для сортировки входного массива, который нужно затем перезаполнить по соответствующим индексам.
Вариант решения с использованием PriorityQueue
и вычислением индексов:
- начальный индекс будет ровно середина массива для нечетной длины и меньше на 1 для четной длины массива
- затем для вычисления следующего индекса нужно будет брать знакопеременные приращения: 1, -2, 3, -4...
Реализация:
public static void spiralSort(int[] arr) {
PriorityQueue<Integer> q = new PriorityQueue<>(arr.length);
for (int n : arr) {
q.add(n);
}
for (int i = arr.length / 2 + arr.length % 2 - 1, d = 1, s = -1;
!q.isEmpty(); i += (s *= -1) * d++)
{
arr[i] = q.poll();
}
}
Тесты:
int[][] tests = {
{8, 1, 2, 5, 7, 12, 3},
{8, 1, 2, 5, 7, 12, 3, 11},
{1},
{3, 1}
};
for (int[] arr : tests) {
System.out.println("before: " + Arrays.toString(arr));
spiralSort(arr);
System.out.println("sorted: " + Arrays.toString(arr));
System.out.println("----");
}
Результаты:
before: [8, 1, 2, 5, 7, 12, 3]
sorted: [12, 7, 3, 1, 2, 5, 8]
----
before: [8, 1, 2, 5, 7, 12, 3, 11]
sorted: [11, 7, 3, 1, 2, 5, 8, 12]
----
before: [1]
sorted: [1]
----
before: [3, 1]
sorted: [1, 3]
----