Дан целочисленный массив из элементов. Элементы массива различны и могут принимать значения от -10000 до 10000. Опишите на одном из языков программирования алгоритм, который находит и выводит второй минимальный элемент массива, если в массиве больше положительных чисел, и второй максимальный, если больше неположительных. Под вторым максимальным элементом подразумевается элемент, следующий за максимальным в порядке убывания, под вторым минимумом — следующий за минимальным в порядке возрастания.
Например, для исходного массива из 6 элементов
-4
5
6
-7
8
9
программа должна вывести
-4
Исходные данные объявлены так, как показано ниже на примерах для некоторых языков программирования. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать некоторые из описанных переменных. Индексация элементов в массиве начинается с 0.
Для начала посчитаем, каких элементов больше (положительных или неположительных). Для этого в переменной (которую изначально приравняем к нулю) будем хранить количество положительных элементов (неположительных тогда будет
). Если положительных элементов окажется больше, будем искать второй минимум, иначе — второй максимум.
Узнав, каких элементов больше, снова обнулим . Если положительных элементов оказалось меньше, то в
будем хранить первый максимум, а в
— второй. Если первый элемент больше второго, то предположим, что первый элемент массива соответствует первому максимуму, а второй — второму, то есть
. Если второй элемент больше первого, то предположим, что
. Тогда будем перебирать элементы, начиная с третьего, в цикле
от 2 до
(от 2, так как индексация с нуля). Если элемент оказался больше, чем
, то этот элемент станет первым максимумом, а предыдущий первый максимум теперь второй, то есть
. В переменную
, в которой хранится значение второго максимума, мы записали предыдущее значение первого максимума, а новым первым максимумом стал текущий элемент. Если элемент оказался больше, чем второй максимум, но меньше, чем первый, то только меняем значение второго максимума:
.
Если положительных элементов оказалось больше, то в будем хранить первый минимум, а в
— второй. Если первый элемент меньше второго, то предположим, что первый элемент массива соответствует первому минимуму, а второй — второму, то есть
. Если второй элемент меньше первого, то предположим, что
. Тогда будем перебирать элементы, начиная с третьего, в цикле
от 2 до
(от 2, так как индексация с нуля). Если элемент оказался меньше, чем
, то элемент станет первым минимумом, а предыдущий первый минимум теперь второй, то есть
. В переменную
, в которой хранится значение второго минимума, мы записали предыдущее значение первого минимума, а новым первым минимумом стал текущий элемент. Если элемент оказался меньше, чем второй минимум, но больше, чем первый, то меняем значение только второго минимума:
.
После того, как мы перебрали все элементы, в оказалось значение второго максимума или второго минимума. Выведем его.
Пример программы на (с комментариями):
, которая отвечает за количество положительных элементов, на 1.
//если положительных элементов оказалось меньше, чем неположительных
//обнулим
//то первый максимум — это
//а второй — это
//иначе
//второй максимум — это
//а первый —
//приравняем второй максимум к текущему значению первого максимума
//и обновим первый максимум
//если элемент больше второго максимума, но меньше первого
//обнулим
//если первый элемент меньше второго
//то первый минимум — это
//а второй — это
//иначе первый минимум — это
//и второй — это
.
//если элемент меньше первого минимума
//вторым минимумом становится предыдущий первый
//а первым — текущий элемент
//обновим второй минимум