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.
В случае произвольных данных это работает с теми же оговорками, что при поиске второго максимального значения.
гостевая; E-mail |