В этой статье рассмотрены два способа нахождения минимального (максимального) элемента массива, а также задачи с применением этих способов.
1 способ
Задача 1: Дан одномерный массив, состоящий из n целых чисел. Найти минимальный элемент массива. В первой строке вводится количество чисел в массиве n. Затем выводятся сами числа, заданные случайным образом. В третьей строке выводится результат: минимальный элемент массива. | |
Исходные данные: |
Результат: |
10 |
-4 |
10 |
0 |
Считаем, что первый элемент массива – минимальный. Затем, сравниваем, начиная со второго до последнего все элементы массива с минимальным. Используем для этого цикл. Если очередной элемент на каком-то шаге цикла оказывается меньше минимального, то значение минимального изменяем, присвоив ему значение этого очередного элемента. По окончании цикла выводим результат: минимальный элемент.
program min1;
var a:array[1..100] of integer;
i,min,n:integer;
begin
//заполнение массива и вывод массива в строчку
readln(n);
for i:=1 to n do begin
a[i]:=random(-100,100);
write(a[i],’ ‘);
end;
//нахождение минимального элемента массива
min:=a[1];
for i:=2 to n do
if min>=a[i] then min:=a[i];
//вывод результата
writeln;
write(min);
end.
Заметим, что для нахождения максимального элемента массива достаточно заменить имя переменной min на max и знак >= на знак <=.
Задача 2: Дан одномерный массив, состоящий из n целых чисел. Найти индекс минимального элемент массива. В первой строке вводится количество чисел в массиве n. Затем выводится массив, заданный случайным образом. В третьей строке выводится результат: индекс минимального элемент массива. |
|
Исходные данные: |
Результат: |
10 |
5 |
10 |
9 |
Если в задаче требуется найти индекс минимального (максимального), то вводим переменную imin, в которую будем запоминать индекс минимального (максимального), причем первоначально ее значение равно 1.
program min2;
var a:array[1..100] of integer;
i,min,n,imin:integer;
begin
//заполнение массива и вывод массива в строчку
readln(n);
for i:=1 to n do begin
a[i]:=random(-100,100);
write(a[i],’ ‘);
end;
//нахождение индекса минимального элемента массива
min:=a[1];
imin:=1;
for i:=2 to n do
if min>=a[i] then begin
imin:=i;
min:=a[i];
end;
//вывод результата
writeln;
write(imin);
end.
Если в массиве есть несколько равных между собой минимальных элементов, то данная программа найдет номер последнего (правого) элемента. Для того чтобы найти индекс первого (левого) элемента достаточно изменить знак >= на строгий знак >.
Эту программу можно оптимизировать, так как, зная индекс минимального элемента, можно найти значение минимального элемента массива. Значит, переменная min не нужна:
var a:array[1..100] of integer;
i,n,imin:integer;
Фрагмент нахождения индекса минимального элемента массива выглядит так:
imin:=1;
for i:=2 to n do
if a[imin]>=a[i] then imin:=i;
Задача 3: Дан одномерный массив, состоящий из n целых чисел. Найти количество минимальных элементов массива. В первой строке вводится количество чисел в массиве n. Затем выводится массив, заданный случайным образом. В третьей строке выводится результат: количество минимальных элементов массива. | |
Исходные данные: |
Результат: |
10 |
2 |
10 |
3 |
program min3;
var a:array[1..100] of integer;
i,min,n,k:integer;
begin
//заполнение массива и вывод массива в строчку
readln(n);
for i:=1 to n do begin
a[i]:=random(-5,5);
write(a[i],’ ‘);
end;
//нахождение минимального элемента массива
min:=a[1];
for i:=2 to n do
if min>=a[i] then
min:=a[i];
//считаем количество равных элементов
k:=0;
for i:=1 to n do
if a[i]=min then k:=k+1;
//вывод результата
writeln;
write(k);
end.
Задача 4: Дан целочисленный массив из n элементов. Элементы массива могут принимать целые значения от 0 до 1000. Напишите программу, находящую минимальное значение среди элементов массива, которые имеют чётное значение и не делятся на четыре. Гарантируется, что в исходном массиве есть хотя бы один элемент, значение которого чётно и не кратно четырем. В первой строке вводится количество чисел в массиве n. Затем выводится массив, заданный случайным образом. В третьей строке выводится результат: минимальное значение среди элементов массива, которые имеют чётное значение и не делятся на четыре. | |
Исходные данные: |
Результат: |
10 |
-6 |
10 |
-10 |
В этой задаче первый способ нахождения минимального не подойдет. Первый элемент массива может оказаться меньше, чем минимальный четный и не кратный четырем и программа выведет неверный результат. Каким должно быть начальное значение переменной min? Его нужно выбрать таким, чтобы для первого же «подходящего» элемента выполнилось условие a[i] < min, и это «временное» начальное значение было бы заменено на реальное. Такое «подходящее» обязательно будет, так как это гарантировано условием задачи. Оно должно быть большим и таким, какое не может быть по условию задачи, например, 1001.
Кроме того заметим, что задавать элементы массива нужно с клавиатуры, чтобы обеспечить условия задачи.
Итак, находим минимальный элемент вторым способом.
2 способ
Записываем в переменную min значение 1001. Затем в цикле просматриваем все элементы массива, с первого до последнего. Если остаток от деления очередного элемента на 2 равен 0 и остаток от его деления на 4 не равен нулю и значение элемента меньше, чем значение переменной min, сохраняем в переменную min значение очередного элемента массива. После окончания работы цикла выводим значение переменной min.
program min4;
var a:array[1..100] of integer;
i,min,n:integer;
begin
//заполнение массива и вывод массива в строчку
readln(n);
for i:=1 to n do
readln(a[i]);
for i:=1 to n do
write(a[i],’ ‘);
//нахождение минимального элемента массива
min:=1001;
for i:=1 to N do
if (a[i] mod 2=0) and (a[i] mod 4 <> 0) and (a[i]<min) then
min:=a[i];
//вывод результата
writeln;
write(min);
end.
Проверяем на тестах:
10 411 837 755 90 520 203 581 798 401 640 |
90 |
10 |
658 |
Конечно, решить эту задачу можно и первым способом, но для нахождения первого значения min нужно написать дополнительные команды поиска. Вот таким может быть решение:
program min5;
var a:array[1..100] of integer;
i,min,n,j:integer;
begin
//заполнение массива и вывод массива в строчку
readln(n);
for i:=1 to n do
readln(a[i]);
for i:=1 to n do
write(a[i],’ ‘);
//нахождение первого четного и не кратного 4 числа
i:=1;
while (i<=n)and not((a[i] mod 2=0) and (a[i] mod 4 <> 0)) do i:=i+1;
//в переменной i запомнился номер первого элемента, удовлетворяющего условию
//нахождение минимального, начиная со следующего за найденным
min:=a[i];
for j:=i+1 to N do
if (a[j] mod 2=0) and (a[j] mod 4 <> 0) and (a[j]<min) then
min:=a[j];
//вывод результата
writeln;
write(min);
end.
Задача 5: Дан целочисленный массив из n элементов. Элементы массива могут принимать произвольные целые значения. Напишите программу, которая находит и выводит второй максимум массива (элемент, который в отсортированном по невозрастанию массиве стоял бы вторым). | |
Исходные данные: |
Результат: |
10 |
14 |
10 |
45 |
Мы знаем, как найти первый максимум, а в этой задаче нужно найти второй по величине максимум. Попробуем это сделать это за один проход по массиву. Нам нужны две переменные, max1 (максимальный элемент) и max2 (второй максимум). Сначала выбираем максимальный из первых двух элементов и записываем его значение в max1, а второй по величине записываем в max2.
Затем в цикле перебираем все элементы, начиная с 3-го до последнего. Если очередной элемент a[i] больше, чем max1, записываем значение max1 в max2 (предыдущий максимум становится вторым), а значение a[i] – в max1. Иначе, если a[i] больше, чем max2, записываем значение a[i] в max2. После завершения цикла выводим значение переменной max2.
program min6;
var a: array [1..100] of integer;
i, k,n, max1, max2: integer;
begin
//заполнение массива и вывод массива в строчку
readln(n);
for i:=1 to n do begin
a[i]:=random(0,100);
write(a[i],’ ‘);
end;
//начальные значения max1 и max2
if a[1] > a[2] then begin
max1:=a[1]; max2:=a[2]
end
else begin
max1:=a[2]; max2:=a[1]
end;
// поиск второго максимального
for i:=3 to N do
if a[i] > max1 then begin
max2:= max1;
max1:= a[i]
end
else
if a[i] > max2 then max2:=a[i];
//вывод результата
writeln;
writeln(max2);
end.
Задача 6: Дан целочисленный массив из 20 элементов. Элементы массива могут принимать целые значения от 1 до 10000 включительно. Напишите программу, позволяющую найти и вывести минимальный элемент массива, шестнадцатеричная запись которого содержит ровно две цифры, причём первая (старшая) цифра больше второй (младшей). Если таких чисел нет, нужно вывести ответ 0. | |
Исходные данные: |
Результат: |
20 |
14 |
10 |
45 |
Эта задача усложнена только тем, что элементы массива должны быть в диапазоне от 16 до 255. В этом случае первая цифра находится как результат деления нацело на 16, а вторая цифра – как остаток от деления на 16.
Кроме этого здесь массив можно объявить через константу n, так как размер массива задан явно: 20 элементов.
program z6;
//объявление массива через константу
const n=20;
var a: array [1..n] of integer;
i,min: integer;
begin
//заполнение массива и вывод массива в строчку
for i:=1 to n do begin
a[i]:=random(0,10000);
write(a[i],’ ‘);
end;
writeln;
min := 10001;
for i := 1 to n do begin
//для проверки правильности программы выведем две шестнадцатеричные цифры:
//write(a[i] div 16,a[i] mod 16,’ ‘);
if (16 <= a[i]) and (a[i] < 256) and (a[i] div 16 > a[i] mod 16) and (a[i] < min) then
min := a[i];
end;
writeln;
//вывод результата
if min = 10001 then
writeln(0)
else
writeln(min);
end.
Задачи для самостоятельного решения:
- Дан целочисленный массив из n элементов. Элементы могут принимать значения от 150 до 210 – рост учащихся выпускного класса. В волейбольную команду берут тех, чей рост не менее 170 см. Напишите программу, которая определяет и выводит минимальный рост игрока баскетбольной команды. Гарантируется, что хотя бы один ученик играет в баскетбольной команде.
- Дан целочисленный массив из n элементов. Элементы массива могут принимать целые значения от 0 до 100 – баллы учащихся выпускного класса за экзамен по информатике. Для получения положительной оценки за экзамен требовалось набрать не менее 50 баллов. Напишите программу, которая находит и выводит минимальный балл среди учащихся, получивших за экзамен положительную оценку. Известно, что в классе хотя бы один учащийся получил за экзамен положительную оценку.
- Дан целочисленный массив – сведения о температуре за каждый день октября. Элементы массива могут принимать целочисленные значение значения от -15 до 20. Напишите программу, которая находит и выводит максимальную температуру среди дней, когда были заморозки (температура опускалась ниже нуля). Гарантируется, что хотя бы один день в октябре была отрицательная температура.
- Дан целочисленный массив из n элементов, все элементы которого – неотрицательные числа, не превосходящие 10000. Напишите программу, которая находит и выводит минимальное трехзначное число, записанное в этом массиве. Если таких чисел нет, нужно вывести сообщение «Таких чисел нет».
- Дан целочисленный массив из n элементов. Элементы массива могут принимать целые значения от 1 до 10000 включительно. Напишите программу, позволяющую найти и вывести наибольший из элементов массива, шестнадцатеричная запись которого оканчивается на букву F. Если таких чисел нет, нужно вывести ответ 0.
- Дан целочисленный массив из n элементов. Элементы массива могут принимать произвольные целые значения. Напишите программу, которая находит и выводит номера двух элементов массива, сумма которых минимальна.
- Дан целочисленный массив из 20 элементов. Элементы массива могут принимать целые значения от 1 до 10000 включительно. Напишите программу, находящую минимальный элементов массива, шестнадцатеричная запись которого содержит ровно две цифры, причём вторая (младшая) цифра – это буква (от A до F). Если таких чисел нет, нужно вывести ответ 0.
Источники информации
- Угринович Н.Д. Информатика и информационные технологии. Учебник для 10-11 классов/ Н.Д. Угринович. – М.:Бином. Лаборатория знаний, 2005.
- Сайт К. Полякова http://kpolyakov.spb.ru/school/ege.htm
Самый простой способ
Разумеется, проще всего получить минимальный и максимальный элементы массива с помощью функций min() и max():
$arr = [8, 4, 12, 9];
$max = max($arr); // 12
$min = min($arr); // 4
Однако на форумах часто просят написать скрипт, не использующий эти функции. Чаще всего этого требуют преподаватели учебных учреждений.
Условия задачи
1. Найти наибольший наименьший элементы в одномерном числовом массиве.
2. Определить номер минимального и максимального элементов заданного одномерного массива.
3. Найти минимальное и максимальное значение в ассоциативном массиве.
Общий принцип поиска элементов
Во всех решениях мы будем использовать одну и ту же логику.
Согласно условию, нам необходимо объявить числовой массив произвольной длины. Также объявим 4 переменные, в которые будем помещать найденные значения и их ключи:
<?php
$arr = [12, 4, 182, 1, 2.587];
$min = null;
$min_key = null;
$max = null;
$max_key = null;
Далее перебираем массив в цикле и на каждой итерации проверяем, больше ли текущее значение, чем самое большое, что мы находили до этого.
И если больше – будем записывать в $max новое максимальное значение, а в $max_key его ключ. Абсолютно также поступим и с минимальными ключом и значением.
Пример с циклом foreach:
foreach($arr as $k => $v)
{
if($v > $max)
{
$max = $v;
$max_key = $k;
}
if($v < $min)
{
$min = $v;
$min_key = $k;
}
}
На данном этапе наш код уже будет работать, но это ещё не всё. Попробуем изменить исходный массив и посмотрим на результат:
<?php
$arr = [0, -12];
$max = null;
foreach($arr as $v)
{
if($v > $max)
$max = $v;
}
var_dump($max); // -12
Максимальным должно быть число 0, но скрипт вывел -12. Дело в том, что PHP не считает истинным выражение 0 > null, поэтому ноль на первой итерации цикла не записался в переменную $max.
Для решения этой проблемы просто добавим условие, что если $max === null, т.е. если это первая итерация, то в любом случае записываем текущее значение в $min и $max:
<?php
$arr = [0, -12];
$max = null;
foreach($arr as $v)
{
if($v > $max or $max === null)
$max = $v;
}
var_dump($max); // -12
Минимальный и максимальный элементы с циклом FOREACH
Решение:
<?php
$arr = [12, 4, 182, 1, 2.587];
$min = null;
$min_key = null;
$max = null;
$max_key = null;
foreach($arr as $k => $v)
{
if($v > $max or $max === null)
{
$max = $v;
$max_key = $k;
}
if($v < $min or $min === null)
{
$min = $v;
$min_key = $k;
}
}
echo "Min value: $min <br> Min key: $min_key <br>";
echo "Max value: $max <br> Max key: $max_key";
Минимальный и максимальный элементы с циклом WHILE
Решение 1: счётчик + count()
Цикл будет выполняться до тех пор, пока значение счётчика $i не превысит количество элементов массива.
<?php
$arr = [12, 4, 182, 1, 2.587];
$min = null;
$min_key = null;
$max = null;
$max_key = null;
$i = 0;
while($i < count($arr))
{
if($arr[$i] > $max or $max === null)
{
$max = $arr[$i];
$max_key = $i;
}
if($arr[$i] < $min or $min === null)
{
$min = $arr[$i];
$min_key = $i;
}
$i++;
}
echo "Min value: $min <br> Min key: $min_key <br>";
echo "Max value: $max <br> Max key: $max_key";
Решение 2: счётчик + isset()
Запускаем вечный цикл while и в каждой итерации цикла проверяем существование следующего элемента с помощью isset(). Если его нет – выходим из цикла оператором break:
<?php
$arr = [12, 4, 182, 1, 2.587];
$min = null;
$min_key = null;
$max = null;
$max_key = null;
$i = 0;
while(true)
{
if(isset($arr[$i]))
{
if($arr[$i] > $max or $max === null)
{
$max = $arr[$i];
$max_key = $i;
}
if($arr[$i] < $min or $min === null)
{
$min = $arr[$i];
$min_key = $i;
}
}
else
break;
$i++;
}
echo "Min value: $min <br> Min key: $min_key <br>";
echo "Max value: $max <br> Max key: $max_key";
Решение 3: list() + each()
Функция each() возвращает ключ и значение текущего элемента массива и смещает его внутренний указатель на единицу. Функция list() используется просто для удобства – с её помощью мы превращаем массив, который возвращает функция each, в две разные переменные:
<?php
$arr = [12, 4, 182, 1, 2.587];
$min = null;
$min_key = null;
$max = null;
$max_key = null;
$i = 0;
while(list($k, $v) = each($arr))
{
if($v > $max or $max === null)
{
$max = $v;
$max_key = $k;
}
if($v < $min or $min === null)
{
$min = $v;
$min_key = $k;
}
}
echo "Min value: $min <br> Min key: $min_key <br>";
echo "Max value: $max <br> Max key: $max_key";
Получился практически аналог foreach. Единственный минус в том, что начиная с PHP 7.2 функция each() объявлена устаревшей.
Решение 4: current() + next()
Это решение похоже на предыдущее с each(). Получаем текущий элемента массива функцией current() и смещаем внутренний указатель массива функцией next(). Получить текущий ключ массива можно с помощью функции key().
<?php
$arr = [12, 4, 182, 1, 2.587];
$min = null;
$min_key = null;
$max = null;
$max_key = null;
$i = 0;
while($v = current($arr))
{
if($v > $max or $max === null)
{
$max = $v;
$max_key = key($arr);
}
if($v < $min or $min === null)
{
$min = $v;
$min_key = key($arr);
}
next($arr);
}
echo "Min value: $min <br> Min key: $min_key <br>";
echo "Max value: $max <br> Max key: $max_key";
Наибольший и наименьший элементы с циклом FOR
Решение 1: счётчик + count()
Вводим счётчик $i и увеличиваем его после каждой итерации. Цикл прекратится как только значение счётчика превысит количество элементов массива.
<?php
$arr = [12, 4, 182, 1, 2.587];
$min = null;
$min_key = null;
$max = null;
$max_key = null;
for($i = 0; $i < count($arr); $i++)
{
if($arr[$i] > $max or $max === null)
{
$max = $arr[$i];
$max_key = $i;
}
if($arr[$i] < $min or $min === null)
{
$min = $arr[$i];
$min_key = $i;
}
}
echo "Min value: $min <br> Min key: $min_key <br>";
echo "Max value: $max <br> Max key: $max_key";
Решение 2: счётчик + isset()
В отличие от предыдущего варианта, мы не смотрим на количество элементов массива, а запускаем вечный цикл и в каждой итерации проверяем существование следующего элемента, и если его нет – прерываем цикл командой break:
<?php
$arr = [12, 4, 182, 1, 2.587];
$min = null;
$min_key = null;
$max = null;
$max_key = null;
for($i = 0; true; $i++)
{
if(!isset($arr[$i]))
break;
if($arr[$i] > $max or $max === null)
{
$max = $arr[$i];
$max_key = $i;
}
if($arr[$i] < $min or $min === null)
{
$min = $arr[$i];
$min_key = $i;
}
}
echo "Min value: $min <br> Min key: $min_key <br>";
echo "Max value: $max <br> Max key: $max_key";
Решение 3: each() + list()
Функция each() возвращает массив с ключом и значением текущего элемента массива, а list() превращает этот массив в 2 разные переменные. После последнего элемента функция each() вернёт false и цикл прекратит работу.
<?php
$arr = [12, 4, 182, 1, 2.587];
$min = null;
$min_key = null;
$max = null;
$max_key = null;
$i = 0;
for(; list($k, $v) = each($arr);)
{
if($v > $max or $max === null)
{
$max = $v;
$max_key = $k;
}
if($v < $min or $min === null)
{
$min = $v;
$min_key = $k;
}
}
echo "Min value: $min <br> Min key: $min_key <br>";
echo "Max value: $max <br> Max key: $max_key";
Решение 4: current() + next()
С помощью функции next() смещаем внутренний указатель массива, а функции current() и key() возвращают текущие ключ и значение. Первое и последнее выражение цикла оставляем пустыми.
<?php
$arr = [12, 4, 182, 1, 2.587];
$min = null;
$min_key = null;
$max = null;
$max_key = null;
$i = 0;
for(; $v = current($arr);)
{
if($v > $max or $max === null)
{
$max = $v;
$max_key = key($arr);
}
if($v < $min or $min === null)
{
$min = $v;
$min_key = key($arr);
}
next($arr);
}
echo "Min value: $min <br> Min key: $min_key <br>";
echo "Max value: $max <br> Max key: $max_key";
Максимальное значение в ассоциативном массиве
В ассоциативных массивах отсутствует порядок или системность в названиях ключей, поэтому циклы со счётчиками здесь недоступны.
Но мы всё ещё можем использовать цикл foreach и те решения для while и for, где используются функции each() и next(), поскольку они используют не ключи, а внутренний указатель массива.
Задачи по нахождению минимального и/или максимального элемента в массиве очень часто встречаются в различных учебных пособиях по программированию и, как правило, вызывают трудности у начинающих программистов или просто студентов, получивших такое задание.
В данной статье вы узнаете, как написать реализацию программы на языке C++, которая находит максимальный и минимальный элемент в массиве и выводит на экран. А узнать множество решений других задач можно в разделе с решениями задач по программированию на языке C++.
Что такое максимальный и минимальный элемент массива
Для начала поймем, что же такое максимальный или минимальный элемент в массиве? Всё просто, максимальный элемент массива — это элемент, который имеет самое большое числовое значение, а минимальный элемент массива — это элемент, имеющий самое маленькое значение.
Пример: в массиве, состоящем из таких элементов: 3, 1, 0, -4, 16, 2 — максимальный элемент равен 16, т.к. это число больше других, а минимальный элемент равен -4, т.к. оно меньше остальных.
Поняв это, можно приступить к решению задачи.
Алгоритм решения задачи
— Инициализация массива, переменных, хранящих минимальное и максимальное значение.
— Заполнение массива случайными числами при помощи цикла и функции, возвращающей случайные числа.
— Вывод массива.
— Сравнение каждого элемента массива: Если элемент больше переменной с максимальным значением, то значение записывается в переменную; Если элемент меньше переменной с минимальным значением, то значение записывается в переменную.
— Вывод переменных с максимальным и минимальным элементом.
Алгоритм решения на языке C++
Для начала нужно подключить заголовок ввода/вывода <iostream>, заголовок стандартных функций <cstdlib> в ней имеется функция rand(), которая позволит заполнить массив случайными числами. Заполнение каждого элемента массива вручную требует времени, его можно сэкономить автоматизировав процесс. Подключаем пространство имён std. Создаём константу N, она будет определять количество элементов в массиве.
#include <iostream> #include <cstdlib> using namespace std; //Пространство имён std const int N = 10;//Количество элементов в массиве int main() { return 0; }
В теле функции main() инициализируем массив целых чисел из N лементов, целочисленные переменные max и min, они будут хранить значение максимального и минимального элементов массива соответственно.
int mass[N], max, min;
Теперь заполним массив случайными числами. Для этого используем цикл от 0 до N (не включительно), который пройдется по каждому элементу массива и поместит случайное значение от 0 до 98. Это можно сделать, использовав функцию rand(), которая возвращает случайное число. Поделить возвращаемое значение на 99 и внести в ячейку остаток от деления, таким образом значение ячейки будет иметь значение в диапазоне от 0 до 99(не включая 99, т.к. остаток от деления не может быть кратным делителю). При этом выведем значения элементов массива на экран.
cout << "Элементы: |"; for(int r = 0; r<N; r++) // Цикл от 0 до N { mass[r] = rand()%99; // Заполнение случайным числом cout << mass[r] << "|"; // Вывод значения } cout << endl;
В результате программа выведет на экран значения элементов массива, разделенное вертикальными чертами:
Элементы: |28|43|72|79|23|70|55|39|69|1|
Обратите внимание! Если вы программируете под Windows и у Вас не отображаются русские символы в консоли, то советую Вам почитать о решении этой проблемы в статье Русские символы(буквы) при вводе/выводе в консоль на C++.
Далее определим максимальный и минимальный элемент в массиве, для этого вновь пройдемся по массиву циклом. При помощи условия определим максимальный и минимальный элемент массива.
Перед циклом нужно будет занести первый элемент массива в переменные min и max, они будут хранить минимальное и максимальное значение изначально, а во время цикла поменяют его, если найдётся значение меньше для min или больше для max.
max = mass[0];//Помещаем значения 1-го элемента min = mass[0];//массива в переменные for(int r = 1; r<N; r++) { if(max < mass[r]) max = mass[r]; //если значение элемента больше значения переменной max, то записываем это значение в переменную if(min > mass[r]) min = mass[r]; //аналогично и для min }
После цикла выведем значения min и max.
cout << "Min: " << min << endl; cout << "Max: " << max << endl;
После компиляции и запуска прогамма выводит следующее
Элементы: |28|43|72|79|23|70|55|39|69|1| Min: 1 Max: 79
Пробегаемся по элементам массива глазами и видим, что минимальное значение — 1, а максимальное — 79. Переменные min и max имеют эти же значения соответственно, следовательно алгоритм работает.
Весь листинг программы на C++
#include <iostream> #include <cstdlib> using namespace std; const int N = 10; int main() { int mass[N], max, min; cout << "Элементы: |"; for(int r = 0; r<N; r++) { mass[r] = rand()%99; cout << mass[r] << "|"; } cout << endl; max = mass[0]; min = mass[0]; for(int r = 1; r<N; r++) { if(max < mass[r]) max = mass[r]; if(min > mass[r]) min = mass[r]; } cout << "Min: " << min << endl; cout << "Max: " << max << endl; return 0; }
Write an efficient C++/C program to find the smallest and second smallest element in an array.
Example:
Input: arr[] = {12, 13, 1, 10, 34, 1} Output: The smallest element is 1 and second Smallest element is 10
Approach 1:
A Simple Solution is to sort the array in increasing order. The first two elements in the sorted array would be the two smallest elements. In this approach, if the smallest element is present more than one time then we will have to use a loop for printing the unique smallest and second smallest elements.
Below is the implementation of the above approach:
C#
using
System;
public
class
GFG {
static
public
void
Main()
{
int
[] arr = { 111, 13, 25, 9, 34, 1 };
int
n = arr.Length;
Array.Sort(arr);
Console.WriteLine(
"smallest element is "
+ arr[0]);
Console.WriteLine(
"second smallest element is "
+ arr[1]);
}
}
C++
#include <bits/stdc++.h>
using
namespace
std;
int
main()
{
int
arr[] = { 111, 13, 25, 9, 34, 1 };
int
n =
sizeof
(arr) /
sizeof
(arr[0]);
sort(arr, arr + n);
cout <<
"smallest element is "
<< arr[0] << endl;
cout <<
"second smallest element is "
<< arr[1];
return
0;
}
Java
import
java.io.*;
import
java.util.*;
class
GFG {
public
static
void
main(String args[])
{
int
arr[] = {
111
,
13
,
25
,
9
,
34
,
1
};
int
n = arr.length;
Arrays.sort(arr);
System.out.println(
"smallest element is "
+ arr[
0
]);
System.out.println(
"second smallest element is "
+ arr[
1
]);
}
}
Python3
arr
=
[
111
,
13
,
25
,
9
,
34
,
1
]
n
=
len
(arr)
arr.sort()
print
(
"smallest element is "
+
str
(arr[
0
]))
print
(
"second smallest element is "
+
str
(arr[
1
]))
Javascript
<script>
let arr = [111, 13, 25, 9, 34, 1];
let n = arr.length;
arr.sort();
document.write(
"smallest element is "
+arr[0],
"</br>"
);
document.write(
"second smallest element is "
+arr[1],
"</br>"
);
</script>
Output
smallest element is 1 second smallest element is 9
Time complexity: O(N*logN)
Auxiliary space: O(1)
Approach 2A:
A Better Solution is to scan the array twice. In the first traversal find the minimum element. Let this element be x. In the second traversal, find the smallest element greater than x.
Using this method, we can overcome the problem of Method 1 which occurs when the smallest element is present in an array more than one time.
The above solution requires two traversals of the input array.
C++
#include <bits/stdc++.h>
using
namespace
std;
int
main()
{
int
arr[] = {12, 13, 1, 10, 34, 1};
int
n =
sizeof
(arr) /
sizeof
(arr[0]);
int
smallest = INT_MAX;
for
(
int
i = 0; i < n; i++)
{
if
(arr[i] < smallest)
{
smallest = arr[i];
}
}
cout <<
"smallest element is: "
<< smallest << endl;
int
second_smallest = INT_MAX;
for
(
int
i = 0; i < n; i++)
{
if
(arr[i] < second_smallest && arr[i] > smallest)
{
second_smallest = arr[i];
}
}
cout <<
"second smallest element is: "
<< second_smallest << endl;
return
0;
}
Java
import
java.io.*;
class
GFG {
public
static
void
main(String args[])
{
int
arr[] = {
12
,
13
,
1
,
10
,
34
,
1
};
int
n = arr.length;
int
smallest = Integer.MAX_VALUE;
for
(
int
i =
0
; i < n; i++) {
if
(arr[i] < smallest) {
smallest = arr[i];
}
}
System.out.println(
"smallest element is: "
+ smallest);
int
second_smallest = Integer.MAX_VALUE;
for
(
int
i =
0
; i < n; i++) {
if
(arr[i] < second_smallest
&& arr[i] > smallest) {
second_smallest = arr[i];
}
}
System.out.println(
"second smallest element is: "
+ second_smallest);
}
}
Python
import
sys
arr
=
[
12
,
13
,
1
,
10
,
34
,
1
]
n
=
len
(arr)
smallest
=
sys.maxint
for
i
in
range
(n):
if
(arr[i] < smallest):
smallest
=
arr[i]
print
(
'smallest element is: '
+
str
(smallest))
second_smallest
=
sys.maxint
for
i
in
range
(n):
if
(arr[i] < second_smallest
and
arr[i] > smallest):
second_smallest
=
arr[i]
print
(
'second smallest element is: '
+
str
(second_smallest))
C#
using
System;
public
class
GFG
{
static
public
void
Main ()
{
int
[] arr = { 12, 13, 1, 10, 34, 1 };
int
n = arr.Length;
int
smallest = Int32.MaxValue;
for
(
int
i = 0; i < n; i++)
{
if
(arr[i] < smallest)
{
smallest = arr[i];
}
}
Console.WriteLine(
"smallest element is: "
+ smallest);
int
second_smallest = Int32.MaxValue;
for
(
int
i = 0; i < n; i++)
{
if
(arr[i] < second_smallest && arr[i] > smallest)
{
second_smallest = arr[i];
}
}
Console.WriteLine(
"second smallest element is: "
+ second_smallest);
}
}
Javascript
<script>
function
solution( arr, arr_size)
{
let first = Number.MAX_VALUE,
second = Number.MAX_VALUE;
if
(arr_size < 2)
{
document.write(
" Invalid Input "
);
return
;
}
for
(let i = 0; i < arr_size ; i ++)
{
if
(arr[i] < first){
first = arr[i];
}
}
for
(let i = 0; i < arr_size ; i ++){
if
(arr[i] < second && arr[i] > first){
second = arr[i];
}
}
if
(second == Number.MAX_VALUE )
document.write(
"There is no second smallest elementn"
);
else
document.write(
"The smallest element is "
+ first +
" and second "
+
"Smallest element is "
+ second +
'n'
);
}
let arr = [ 12, 13, 1, 10, 34, 1 ];
let n = arr.length;
solution(arr, n);
</script>
Output
smallest element is: 1 second smallest element is: 10
Time complexity: O(N)
Auxiliary space: O(1)
Approach 2B:
Efficient Solution can find the minimum two elements in one traversal. Below is the complete algorithm.
Algorithm:
1. Initialize both first and second smallest as INT_MAX
first = second = INT_MAX
2. Loop through all the elements.
- If the current element is smaller than first, then update first and second.
- Else if the current element is smaller than second then update second.
Below is the implementation of the above approach:
C
#include <limits.h> /* For INT_MAX */
#include <stdio.h>
void
print2Smallest(
int
arr[],
int
arr_size)
{
int
i, first, second;
if
(arr_size < 2) {
printf
(
" Invalid Input "
);
return
;
}
first = second = INT_MAX;
for
(i = 0; i < arr_size; i++) {
if
(arr[i] < first) {
second = first;
first = arr[i];
}
else
if
(arr[i] < second && arr[i] != first)
second = arr[i];
}
if
(second == INT_MAX)
printf
(
"There is no second smallest elementn"
);
else
printf
(
"The smallest element is %d and second "
"Smallest element is %dn"
,
first, second);
}
int
main()
{
int
arr[] = { 12, 13, 1, 10, 34, 1 };
int
n =
sizeof
(arr) /
sizeof
(arr[0]);
print2Smallest(arr, n);
return
0;
}
C#
using
System;
class
GFG {
static
void
print2Smallest(
int
[] arr)
{
int
first, second, arr_size = arr.Length;
if
(arr_size < 2) {
Console.Write(
" Invalid Input "
);
return
;
}
first = second =
int
.MaxValue;
for
(
int
i = 0; i < arr_size; i++) {
if
(arr[i] < first) {
second = first;
first = arr[i];
}
else
if
(arr[i] < second && arr[i] != first)
second = arr[i];
}
if
(second ==
int
.MaxValue)
Console.Write(
"There is no second"
+
"smallest element"
);
else
Console.Write(
"The smallest element is "
+ first
+
" and second Smallest"
+
" element is "
+ second);
}
public
static
void
Main()
{
int
[] arr = { 12, 13, 1, 10, 34, 1 };
print2Smallest(arr);
}
}
C++
#include <bits/stdc++.h>
using
namespace
std;
void
print2Smallest(
int
arr[],
int
arr_size)
{
int
i, first, second;
if
(arr_size < 2) {
cout <<
" Invalid Input "
;
return
;
}
first = second = INT_MAX;
for
(i = 0; i < arr_size; i++) {
if
(arr[i] < first) {
second = first;
first = arr[i];
}
else
if
(arr[i] < second && arr[i] != first)
second = arr[i];
}
if
(second == INT_MAX)
cout <<
"There is no second smallest elementn"
;
else
cout <<
"The smallest element is "
<< first
<<
" and second "
"Smallest element is "
<< second << endl;
}
int
main()
{
int
arr[] = { 12, 13, 1, 10, 34, 1 };
int
n =
sizeof
(arr) /
sizeof
(arr[0]);
print2Smallest(arr, n);
return
0;
}
Java
import
java.io.*;
class
SecondSmallest {
static
void
print2Smallest(
int
arr[])
{
int
first, second, arr_size = arr.length;
if
(arr_size <
2
) {
System.out.println(
" Invalid Input "
);
return
;
}
first = second = Integer.MAX_VALUE;
for
(
int
i =
0
; i < arr_size; i++) {
if
(arr[i] < first) {
second = first;
first = arr[i];
}
else
if
(arr[i] < second && arr[i] != first)
second = arr[i];
}
if
(second == Integer.MAX_VALUE)
System.out.println(
"There is no second"
+
"smallest element"
);
else
System.out.println(
"The smallest element is "
+ first
+
" and second Smallest"
+
" element is "
+ second);
}
public
static
void
main(String[] args)
{
int
arr[] = {
12
,
13
,
1
,
10
,
34
,
1
};
print2Smallest(arr);
}
}
Python3
import
math
def
print2Smallest(arr):
arr_size
=
len
(arr)
if
arr_size <
2
:
print
(
"Invalid Input"
)
return
first
=
second
=
math.inf
for
i
in
range
(
0
, arr_size):
if
arr[i] < first:
second
=
first
first
=
arr[i]
elif
(arr[i] < second
and
arr[i] !
=
first):
second
=
arr[i]
if
(second
=
=
math.inf):
print
(
"No second smallest element"
)
else
:
print
(
'The smallest element is'
, first,
'and'
,
' second smallest element is'
, second)
arr
=
[
12
,
13
,
1
,
10
,
34
,
1
]
print2Smallest(arr)
PHP
<?php
function
print2Smallest(
$arr
,
$arr_size
)
{
$INT_MAX
= 2147483647;
if
(
$arr_size
< 2)
{
echo
(
" Invalid Input "
);
return
;
}
$first
=
$second
=
$INT_MAX
;
for
(
$i
= 0;
$i
<
$arr_size
;
$i
++)
{
if
(
$arr
[
$i
] <
$first
)
{
$second
=
$first
;
$first
=
$arr
[
$i
];
}
else
if
(
$arr
[
$i
] <
$second
&&
$arr
[
$i
] !=
$first
)
$second
=
$arr
[
$i
];
}
if
(
$second
==
$INT_MAX
)
echo
(
"There is no second smallest elementn"
);
else
echo
"The smallest element is "
,
$first
,
" and second Smallest element is "
,
$second
;
}
$arr
=
array
(12, 13, 1, 10, 34, 1);
$n
=
count
(
$arr
);
print2Smallest(
$arr
,
$n
)
?>
Javascript
<script>
function
print2Smallest( arr, arr_size)
{
let i, first, second;
if
(arr_size < 2)
{
document.write(
" Invalid Input "
);
return
;
}
first=Number.MAX_VALUE ;
second=Number.MAX_VALUE ;
for
(i = 0; i < arr_size ; i ++)
{
if
(arr[i] < first)
{
second = first;
first = arr[i];
}
else
if
(arr[i] < second && arr[i] != first)
second = arr[i];
}
if
(second == Number.MAX_VALUE )
document.write(
"There is no second smallest elementn"
);
else
document.write(
"The smallest element is "
+ first +
" and second "
+
"Smallest element is "
+ second +
'n'
);
}
let arr = [ 12, 13, 1, 10, 34, 1 ];
let n = arr.length;
print2Smallest(arr, n);
</script>
Output
The smallest element is 1 and second Smallest element is 10
The same approach can be used to find the largest and second-largest elements in an array.
Time Complexity: O(n)
Auxiliary Space: O(1)
Approach 3:
A N*log(N) approach using Priority_queue data structure. You can read about Priority Queue in more detail here.
C#
using
System;
using
System.Collections.Generic;
class
GFG {
static
void
Main(
string
[] args)
{
int
[] arr = { 2, 5, 7, 3, 9, 10, 11, 1 };
int
n = arr.Length;
PriorityQueue<
int
> pq =
new
PriorityQueue<
int
>();
for
(
int
i = 0; i < n; i++) {
pq.Enqueue(arr[i]);
}
int
t = pq.Peek();
pq.Dequeue();
int
w = pq.Peek();
Console.WriteLine(
"smallest element : "
+ t);
Console.WriteLine(
"second smallest element : "
+ w);
}
}
public
class
PriorityQueue<T>
where
T : IComparable<T> {
private
List<T> data;
public
PriorityQueue() {
this
.data =
new
List<T>(); }
public
void
Enqueue(T item)
{
data.Add(item);
int
ci = data.Count - 1;
while
(ci > 0) {
int
pi = (ci - 1) / 2;
if
(data[ci].CompareTo(data[pi]) >= 0)
break
;
T tmp = data[ci];
data[ci] = data[pi];
data[pi] = tmp;
ci = pi;
}
}
public
T Dequeue()
{
int
li = data.Count - 1;
T frontItem = data[0];
data[0] = data[li];
data.RemoveAt(li);
--li;
int
pi = 0;
while
(
true
) {
int
ci = pi * 2 + 1;
if
(ci > li)
break
;
int
rc = ci + 1;
if
(rc <= li
&& data[rc].CompareTo(data[ci]) < 0)
ci = rc;
if
(data[pi].CompareTo(data[ci]) <= 0)
break
;
T tmp = data[pi];
data[pi] = data[ci];
data[ci] = tmp;
pi = ci;
}
return
frontItem;
}
public
T Peek()
{
T frontItem = data[0];
return
frontItem;
}
public
int
Count
{
get
{
return
data.Count; }
}
}
C++
#include <bits/stdc++.h>
using
namespace
std;
int
main()
{
int
arr[] = { 2, 5, 7, 3, 9, 10, 11, 1 };
int
n =
sizeof
(arr) /
sizeof
(arr[0]);
priority_queue<
int
, vector<
int
>, greater<
int
> >
pq;
for
(
int
i = 0; i < n; i++) {
pq.push(arr[i]);
}
int
t = pq.top();
pq.pop();
int
w = pq.top();
cout <<
"smallest element : "
<< t << endl;
cout <<
"second smallest element : "
<< w << endl;
return
0;
}
Java
import
java.util.*;
class
GFG {
public
static
void
main(String[] args)
{
int
arr[] = {
2
,
5
,
7
,
3
,
9
,
10
,
11
,
1
};
int
n = arr.length;
PriorityQueue<Integer> pq
=
new
PriorityQueue<Integer>();
for
(
int
i =
0
; i < n; i++) {
pq.add(arr[i]);
}
int
t = pq.peek();
pq.poll();
int
w = pq.peek();
System.out.println(
"smallest element : "
+ t);
System.out.println(
"second smallest element : "
+ w);
}
}
Python3
from
queue
import
PriorityQueue
arr
=
[
2
,
5
,
7
,
3
,
9
,
10
,
11
,
1
]
n
=
len
(arr)
pq
=
PriorityQueue()
for
i
in
range
(
0
, n):
pq.put(arr[i])
t
=
pq.get()
w
=
pq.get()
print
(
"smallest element :"
, t)
print
(
"second smallest element :"
, w)
Javascript
class PriorityQueue {
constructor() {
this
.values = [];
}
enqueue(val, priority) {
this
.values.push({ val, priority });
this
.sort();
}
dequeue() {
return
this
.values.shift();
}
sort() {
this
.values.sort((a, b) => a.priority - b.priority);
}
get top() {
return
this
.values[0].val;
}
get secondTop() {
return
this
.values[1].val;
}
}
const arr = [2, 5, 7, 3, 9, 10, 11, 1];
const pq =
new
PriorityQueue();
for
(let i = 0; i < arr.length; i++) {
pq.enqueue(arr[i], arr[i]);
}
const t = pq.top;
pq.dequeue();
const w = pq.top;
console.log(
"smallest element: "
, t);
console.log(
"second smallest element: "
, w);
Output
smallest element : 1 second smallest element : 2
Time Complexity: O(n*log(n))
In a priority queue time for adding each element is O(logn) and we are adding all the elements so the total time taken by the priority queue will be O(n*logn)
Auxiliary Space: O(n)
The extra space is used to store the elements in the priority queue.
Related Article: Minimum and Second minimum elements using minimum comparisons
Approach 4: Using list properties
Algorithm:
- Step 1: Declare a new list
- Step 2: Check length of the original list is more than 2 or not.
- Step 3: Append the smallest element from the original list into new list.
- Step 4: Count the number times smallest element appeared in the original list, then run a loop to remove all the smallest elements from the original list.
- Step 5: After removing all smallest elements, now find for 2nd smallest element using min function.
- Step 6: return new list which contains the smallest element and 2nd smallest element.
Example:
C++
#include <bits/stdc++.h>
using
namespace
std;
vector<
int
> print2Smallest(vector<
int
> arr)
{
vector<
int
> lst;
if
(unordered_set<
int
>(arr.begin(), arr.end()).size()
== 1) {
return
{ -1, -1 };
}
lst.push_back(*min_element(
arr.begin(), arr.end()));
int
p = *min_element(arr.begin(),
arr.end());
int
c = count(arr.begin(), arr.end(),
p);
arr.erase(
remove
(arr.begin(), arr.end(), p),
arr.end());
lst.push_back(*min_element(
arr.begin(),
arr.end()));
return
lst;
}
int
main()
{
vector<
int
> arr = { 12, 13, 1, 10, 34, 1 };
vector<
int
> res = print2Smallest(arr);
for
(
int
i = 0; i < res.size(); i++) {
cout << res[i] <<
" "
;
}
return
0;
}
Java
import
java.util.*;
public
class
Main {
public
static
List<Integer>
print2Smallest(List<Integer> arr)
{
List<Integer> lst
=
new
ArrayList<>();
if
(
new
HashSet<Integer>(arr).size()
==
1
) {
return
Arrays.asList(-
1
, -
1
);
}
lst.add(Collections.min(
arr));
int
p = Collections.min(arr);
int
c = Collections.frequency(
arr, p);
arr.removeAll(Collections.singleton(
p));
lst.add(Collections.min(
arr));
return
lst;
}
public
static
void
main(String[] args)
{
List<Integer> arr =
new
ArrayList<>(
Arrays.asList(
12
,
13
,
1
,
10
,
34
,
1
));
List<Integer> res = print2Smallest(arr);
for
(
int
i =
0
; i < res.size(); i++) {
System.out.print(res.get(i) +
" "
);
}
}
}
Python3
def
print2Smallest(arr):
lst
=
[]
if
len
(
set
(arr))
=
=
1
:
return
[
-
1
,
-
1
]
lst.append(
min
(arr))
p
=
min
(arr)
c
=
arr.count(p)
for
i
in
range
(c):
arr.remove(p)
lst.append(
min
(arr))
return
lst
arr
=
[
12
,
13
,
1
,
10
,
34
,
1
]
print
(print2Smallest(arr))
Javascript
function
print2Smallest(arr) {
let lst = [];
if
(
new
Set(arr).size === 1) {
return
[-1, -1];
}
lst.push(Math.min(...arr));
let p = Math.min(...arr);
let c = arr.filter((el) => el === p).length;
for
(let i = 0; i < c; i++) {
arr.splice(arr.indexOf(p), 1);
}
lst.push(Math.min(...arr));
return
lst;
}
let arr = [12, 13, 1, 10, 34, 1];
console.log(print2Smallest(arr));
C#
using
System;
using
System.Collections.Generic;
using
System.Linq;
public
class
MainClass {
public
static
List<
int
> Print2Smallest(List<
int
> arr) {
List<
int
> lst =
new
List<
int
>();
if
(
new
HashSet<
int
>(arr).Count == 1) {
return
new
List<
int
> {-1, -1};
}
lst.Add(arr.Min());
int
p = arr.Min();
int
c = arr.Count(x => x == p);
arr.RemoveAll(x => x == p);
lst.Add(arr.Min());
return
lst;
}
public
static
void
Main() {
List<
int
> arr =
new
List<
int
>{12, 13, 1, 10, 34, 1};
List<
int
> res = Print2Smallest(arr);
foreach
(
int
i
in
res) {
Console.Write(i +
" "
);
}
}
}
Time Complexity: O(N)
Auxiliary Space: O(1)
Please write comments if you find any bug in the above program/algorithm or other ways to solve the same problem.
Last Updated :
13 Apr, 2023
Like Article
Save Article
Принцип поиска максимального или
минимального элемента массива заключается
в следующем: в дополнительную переменную
заносится значение первого элемента
массива, которое принимается за максимум
(минимум); затем организовывается перебор
оставшихся элементов массива, каждый
из которых сравнивается с максимумом
(минимумом); если текущий элемент массива
оказывается больше (меньше), чем принятый
за максимум (минимум), то этот элемент
становится максимальным (минимальным).
Таким образом, после завершения перебора
элементов массива в дополнительной
переменной окажется максимальное
(минимальное) значение среди элементов
массива. Фрагмент блок-схемы алгоритма,
реализующий описанный метод приведен
на рисунке 5.2.1.
В блоке 1 дополнительным переменным maxиmin, в которых
будут храниться максимальное и минимальное
значения соответственно, присваивается
значение 1-го элемента массива. Кроме
этого введены еще две переменныеimaxиimin, которые будут
использоваться для хранения номеров
максимального и минимального элементов
массива. С помощью блока модификации
(блок 2) организовывается цикл по перебору
элементов массива Х (перебор начинается
со 2-го элемента, так как 1-й элемент уже
обработан в блоке 1). Если текущий элемент
массиваXiбольше значения, которое хранится в
переменнойmax(блок 3), то за максимум принимается
значение этого элемента:max=Xi,
и запоминается его номер:imax=i(блок 4). Если текущий элемент массива
не больше максимума, то проверяется, не
меньше ли он минимума (блок 5). В случае
если текущий элементXiокажется меньше минимального значения,
которое хранится в переменнойmin,
то за минимум принимается значение
этого элемента:min=Xi,
и запоминается его номер: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не допустимо.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #