У меня получился довольно громоздкий код, уверен данная задачка решается в 2 строки, подскажите как?
List<Integer> nums = new ArrayList<>();
List<String> str = new ArrayList<>();

List<Integer> indxInt = new ArrayList<>();
List<Integer> indxStr = new ArrayList<>();

Map<Integer, Integer> mapInt = new HashMap<Integer, Integer>();
Map<Integer, String> mapStr = new HashMap<Integer, String>();

boolean isSorted = false;
String buf;

//Разделение массива на 2 листа (индекс элемента, значение)
for (int i = 0; i < array.length; i++) {
    if (isNumber(array[i])) {
        indxInt.add(i);
        nums.add(Integer.parseInt(array[i]));
    } else {
        indxStr.add(i);
        str.add(array[i]);
    }
}

//Сортировка массива Int
nums.sort(Collections.reverseOrder());

//Сортировка массива Str
while(!isSorted) {
    isSorted = true;
    for (int i = 0; i < str.size()-1; i++) {
        if(isGreaterThan(str.get(i), str.get(i+1))) {
            isSorted = false;
            buf = str.get(i);
            str.set(i, str.get(i+1));
            str.set(i + 1, buf);
        }
    }
}


//Заполнение мапы Int
for (int i = 0; i < nums.size(); i++) {
    mapInt.put(indxInt.get(i), nums.get(i));
}
//Заполнение мапы Str
for (int i = 0; i < str.size(); i++) {
    mapStr.put(indxStr.get(i), str.get(i));
}

for (Map.Entry<Integer, Integer> pairInt : mapInt.entrySet()) {
    array[pairInt.getKey()] = pairInt.getValue().toString();
}
for (Map.Entry<Integer, String> pairStr : mapStr.entrySet()) {
    array[pairStr.getKey()] = pairStr.getValue();
}