Эта задачка применялась, как минимум, на собеседованиях в Sun Microsystems. Задачка миленькая, несложная, на сообразительность.
Задача
Отсортировать массив, состоящий только из единиц и двоек.
Решения
Решений, как у большинства задачек много. Приведем некоторые.
- Сложить все элементы массива и вычесть из суммы длину массива. Результатом будет количество двоек в массиве. Далее массив заливается нужным количеством последовательных двоек и единиц.
- Посчитать количество единиц и двоек, пройдя по массиву. Далее опять заливаем массив нужным количеством двоек и единиц.
- Запускаем в цикле два счетчика, сближающихся с противоположных концов массива. Меняем местами соответствующие значения, по необходимости.
В третьем варианте что-то вроде:
public void sort12(int []array) {
int i = 0;
int j = array.length-1;
for (; i<j; i++) {
// Сортируем по возрастанию
if (array[i] == 2) {
for (; array[j] == 2; j--);
array[i] = 1;
array[j] = 2;
j--;
}
}
}
Первый вариант представляется самым оптимальным, с точки зрения производительности: сравнений нет, все действия с массивом последовательные. В нём как раз проявляется сообразительность 🙂
Второй вариант похуже, но тоже ничего.
Третий вариант видится близким ко второму, на достаточно небольших массивах (влезающих в кэш) и похуже на больших массивах.