Консультация № 159309
01.02.2009, 11:01
0.00 руб.
0 4 1
Дан массив из n элементов, сортировать массив обменом четных элементов стоящих на четных позициях, вывести на экран количество перестановок.

Обсуждение

Неизвестный
01.02.2009, 12:06
общий
Что значит сортировать обменом четных элементов стоящих на четных позициях.
Если у нас есть массив (9,8,7,5,4,3,1,0), четные стоящие на четных позициях только 8 и 0. Результат должен быть (9,0,7,5,4,3,1,8)? Или как понять условие?
Неизвестный
01.02.2009, 12:10
общий
да если массив (9,8,7,5,4,3,1,0) тогда результат (9,0,7,5,4,3,1,8)
Неизвестный
01.02.2009, 13:02
общий
это ответ
Здравствуйте, Иванов Виктор Олегович!
Программа с комментариями. Поскольку в условии не сказано направление сортировки, сортировал по возрастанию.

Программа:
Код:

program Pascal_159309;
{ Размер массива }
const
N=16;
var
Arr:array[1..N]of integer;
i,j,j1,j2,tmp,cnt:integer;
begin
Randomize;
{ Создаем массив и выводим его на зкран }
WriteLn('Array:');
for i := 1 to N do begin
Arr[i]:=Random(51)-25;
Write(Arr[i]:4,' ');
end;
WriteLn;
{ Сортируем }
cnt:=0; { Счетчик перестановок }
{ Идем только по четным индексам }
i:=0;
while i<N do begin
i:=i+2;
j:=i;
while j<N do begin
j:=j+2;
{ Если оба элемента четные и неупорядоченные }
if (not Odd(Arr[i])) and (not Odd(Arr[j])) and (Arr[i]>Arr[j]) then begin
tmp:=Arr[i];
Arr[i]:=Arr[j];
Arr[j]:=tmp;
Inc(cnt); { Увеличим счетчик }
end;
end;
end;
{ Выводим результат }
WriteLn('Result Array:');
for i := 1 to N do
Write(Arr[i]:4,' ');
WriteLn;
{ Выводим количество перестановок }
WriteLn('Rearrangements=',cnt);
ReadLn;
end.


Пример результата работы:
Код:

Array:
10 14 9 -10 16 -10 15 12 24 -24 -24 -16 -11 15 25 23

Result Array:
10 -24 9 -16 16 -10 15 -10 24 12 -24 14 -11 15 25 23

Rearrangements=9
Неизвестный
01.02.2009, 13:19
общий
Можно еще немного оптимизировать программу:
Код:

program Pascal_159309;
{ Размер массива }
const
N=16;
var
Arr:array[1..N]of integer;
i,j,tmp,cnt:integer;
begin
Randomize;
{ Создаем массив и выводим его на зкран }
WriteLn('Array:');
for i := 1 to N do begin
Arr[i]:=Random(51)-25;
Write(Arr[i]:4,' ');
end;
WriteLn;
{ Сортируем }
cnt:=0; { Счетчик перестановок }
{ Идем только по четным индексам }
i:=0;
while i<N do begin
i:=i+2;
{ Только если четный элемент }
if not Odd(Arr[i]) then begin
j:=i;
while j<N do begin
j:=j+2;
{ Если оба элемента четные и неупорядоченные }
if (not Odd(Arr[j])) and (Arr[i]>Arr[j]) then begin
tmp:=Arr[i];
Arr[i]:=Arr[j];
Arr[j]:=tmp;
Inc(cnt); { Увеличим счетчик }
end;
end;
end;
end;
{ Выводим результат }
WriteLn('Result Array:');
for i := 1 to N do
Write(Arr[i]:4,' ');
WriteLn;
{ Выводим количество перестановок }
WriteLn('Rearrangements=',cnt);
ReadLn;
end.
Форма ответа