double arrow

Нахождение максимального и минимального

Элементов массива

Принцип поиска максимального или минимального элемента массива заключается в следующем: в дополнительную переменную заносится значение первого элемента массива, которое принимается за максимум (минимум); затем организовывается перебор оставшихся элементов массива, каждый из которых сравнивается с максимумом (минимумом); если текущий элемент массива оказывается больше (меньше), чем принятый за максимум (минимум), то этот элемент становится максимальным (минимальным). Таким образом, после завершения перебора элементов массива в дополнительной переменной окажется максимальное (минимальное) значение среди элементов массива. Фрагмент блок-схемы алгоритма, реализующий описанный метод приведен на рисунке 5.2.1.

 
 


В блоке 1 дополнительным переменным max и min, в которых будут храниться максимальное и минимальное значения соответственно, присваивается значение 1-го элемента массива. Кроме этого введены еще две переменные imax и imin, которые будут использоваться для хранения номеров максимального и минимального элементов массива. С помощью блока модификации (блок 2) организовывается цикл по перебору элементов массива Х (перебор начинается со 2-го элемента, так как 1-й элемент уже обработан в блоке 1). Если текущий элемент массива Xi больше значения, которое хранится в переменной max (блок 3), то за максимум принимается значение этого элемента: max=X i, и запоминается его номер: imax=i (блок 4). Если текущий элемент массива не больше максимума, то проверяется, не меньше ли он минимума (блок 5). В случае если текущий элемент Xi окажется меньше минимального значения, которое хранится в переменной min, то за минимум принимается значение этого элемента: min=X i, и запоминается его номер: imin=i (блок 6). После выхода из цикла будут выведены значения максимального и минимального элементов, а также их номера в массиве (блок 7).

Приведенный выше алгоритм имеет один недостаток – в нем используется две лишние переменные max и min. Зная индекс элемента массива всегда можно получить его значение, поэтому нет необходимости хранить максимальное и минимальное значения в отдельных переменных. Оптимальный алгоритм приведен на рис. 5.2.2.

В блоке 1 дополнительным переменным imax и imin, используемых для хранения номеров максимального и минимального элемента, присваивается значение 1. Таким образом, за максимум и минимум принимается 1-й элемент массива, само же значение этого элемента нигде дополнительно не сохраняется. Оставшиеся элементы массива также перебираются, начиная со второго (блок 2). При этом каждый элемент массива Xi сравнивается с элементами, имеющими номер равный imax (блок 3) и imin (блок 6), т.е. с элементами принятыми за максимум (минимум). Если результат проверки условий является истиной, то в переменных imax и imin сохраняются индексы новых максимального (блок 4) и минимального (блок 6) элементов. После выхода из цикла будут выведены значения максимального и минимального элементов, а также их номера в массиве (блок 7).

Если в массиве имеется несколько элементов равных по значению максимальному (минимальному) элементу, то алгоритмы, приведенные на рис 5.2.1 и 5.2.2, определят позицию только первого такого элемента. Например, чтобы найти количество элементов массива равных максимальному и позицию последнего такого элемента, можно воспользоваться алгоритмом, приведенным на рис. 5.2.3.

В начале алгоритма за максимум принимается 1-й элемент массива и вводится переменная k для подсчета количества элементов равных максимальному (блок 1). Затем организовывается цикл по перебору оставшихся элементов массива (блок 2). На каждом шаге цикла выполняется следующая последовательность действий.


Вначале текущий элемент массива Xi сравнивается с максимальным (блок 3). Если он оказывается больше элемента, принятого за максимальный, то запоминается номер этого элемента и переменной k присваивается 1 (блок 4). Это означает, что встретился первый «новый» максимальный элемент.

Если текущий элемент не больше максимума, значит, он может быть равным или меньше максимального элемента. Поэтому в блоке 5 текущий элемент массива Xi проверяется на равенство максимальному. Если он оказывается равным максимуму, то опять запоминается номер текущего элемента и значение переменной k увеличивается на 1 (блок 6). Это означает, что встретился следующий элемент равный максимальному элементу. В итоге после выхода из цикла в переменной imax будет храниться индекс последнего по счету элемента равного максимальному, а в переменной k количество элементов, равных максимуму. Если же из блока 6 убрать операцию imax=i, то в переменной imax, как и в предыдущих примерах будет сохранен номер первого по счету элемента равного максимальному.

В некоторых задачах невозможно вначале принять за максимум (минимум) первый элемент массива. Например, если элементы массива ещё не определены (не введены или не вычислены), или если необходимо найти максимум (минимум) только среди положительных, четных по значению и т.д. элементов. Во втором случае неизвестно когда в массиве встретится первый такой элемент. В таких ситуациях можно использовать способ, реализованный в алгоритме из примера 5.2.

Пример 5.2. В массиве Х [N] найти минимальный положительный элемент.

Массив Х может содержать как положительные, так и отрицательные элементы. Поэтому неизвестно какой элемент массива или произвольное значение можно принять за начальный минимум. Решение поставленной задачи можно разбить на два этапа: поиск положительных элементов в массиве с определением первого такого элемента и поиск среди положительных элементов минимального по значению. Блок-схема алгоритма приведена на рис. 5.2.4.

В нашем примере нумерация элементов массива начинается с единицы, поэтому в качестве начального значения для переменной imin принимается 0 (блок 1), т.е. значение которое не могут принимать индексы элементов массива Х. Таким образом показывается, что при обработке массива еще не встречался положительный элемент, который можно принять за начальное значение для минимума. Затем организовывается цикл по перебору всех элементов массива (блок 2). На каждом шаге цикла выполняется следующая последовательность действий.

В блоке 3 проверяется, не является ли текущий элемент массива Xi положительным. Если он отрицательный или равен нулю, то такой элемент пропускается и над ним не выполняется никаких действий. Если Xi > 0, то в блоке 4 проверяется, не является ли этот элемент первым встретившимся положительным элементом массива (признаком чего служит значение imin равное 0). В этом случае в блоке 5 переменной imin будет присвоено текущее значение i. Таким образом, за начальное значение для минимума будет принято значение первого по счету положительного элемента массива Х. Эта ситуация может возникнуть только один раз, и при дальнейшей работе цикла блок 5 больше выполняться не будет. Остальные положительные элементы массива в блоке 6 будут сравниваться с элементом массива, принятым в текущий момент за минимум. Если такой элемент окажется меньше минимального, то в блоке 7 в переменной imin будет сохранен его номер i.

После выхода из цикла проверяется, не равно ли значение imin нулю (блок 8), так как сразу же выводить значение минимального элемента массива Ximin и его номер imin (блок 9) нельзя. Это объясняется тем что, если в массиве Х не будет положительных элементов, то значение переменной imin останется равным нулю, а обращение к несуществующему элементу массива Х 0 не допустимо.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



Сейчас читают про: