Эта задачка применялась, как минимум, на собеседованиях в 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--; } } }
Первый вариант представляется самым оптимальным, с точки зрения производительности: сравнений нет, все действия с массивом последовательные. В нём как раз проявляется сообразительность 🙂
Второй вариант похуже, но тоже ничего.
Третий вариант видится близким ко второму, на достаточно небольших массивах (влезающих в кэш) и похуже на больших массивах.