Pers.narod.ru. Алгоритмы. Нахождение второго по величине максимального (минимального) значения в массиве |
Найти второй по величине максимальный (минимальный) элемент в данном массиве за однократный просмотр массива. Задача включена в рекомендуемые для подготовки к ЕГЭ по информатике 2010 года.
Вот одна из возможных версий такой программы для поиска и вывода второго по величине значения:
const n=5;
const a:array [1..n] of integer =
(7,7,7,7,6);
var i,max,max2:integer;
begin
max:=a[1];
max2:=-MAXINT;
for i:=2 to n do
if a[i]>max then begin max2:=max; max:=a[i]; end
else if (a[i]<max) and (a[i]>max2) then max2:=a[i];
if max2=-MAXINT then writeln ('max2 incorrect',',max=',max)
else writeln ('max2=',max2,',max=',max);
end.
Обратим внимание на несколько нюансов в этом решении:
max2 остаётся равным -MAXINT.
max2:=a[1]; - это не работает, если a[1]=max.
if написать if a[i]>=max - тогда получим max2=max, если в массиве есть повторяющиеся значения max, а в условии не сказано, что их там нет.
else условие else if (a[i]<max) - также получим max2=max при дублях значения max в массиве.
Если по условию все элементы массива имеют разные значения, программа упрощается до
const n=5;
const a:array [1..n] of integer =
(6,5,7,4,3);
var i,max,max2:integer;
begin
max:=a[1];
max2:=a[2];
for i:=2 to n do
if a[i]>max then begin max2:=max; max:=a[i]; end
else if a[i]>max2 then max2:=a[i];
writeln ('max2=',max2,',max=',max);
end.
Изменения первой программы для поиска второго минимального значения очевидны:
const n=5;
const a:array [1..n] of integer =
(6,7,7,7,7);
var i,min,min2:integer;
begin
min:=a[1];
min2:=MAXINT;
for i:=2 to n do
if a[i]<min then begin min2:=min; min:=a[i]; end
else if (a[i]>min) and (a[i]<min2) then min2:=a[i];
if min2=MAXINT then writeln ('min2 incorrect',',min=',min)
else writeln ('min2=',min2,',min=',min);
end.
В случае произвольных данных это работает с теми же оговорками, что при поиске второго максимального значения.
|
|