Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Возвращение былого порядка массиву

Автор: Tribunal 8.06.2006 10:53

есть исходный массив и соответствующий ему массив номеров эл-тов.
нужно перемешать эл-ты массива номеров и в соответствии с ним основной массив.
затем вернуть его изначальный порядок.
вот то,что у меня получилось...
но я явно как-то неправильно связываю сортировку массива номеров с перемещением эл-тов в основном массиве.только вот ничего другого никак придумать не могу...помогите,пожалуйста...

type
artype=array [1..20] of byte;
var
n,i,j,t,h:byte;
k,d,k1,d1:artype;

begin
write('Enter the number of elements ');readln(n);
randomize;

//create
writeln('Ishodniy massiv:');
for i:=1 to n do
begin
d[i]:=random(20);
write(d[i],' ' );
k[i]:=i;
end;
writeln;

//mix
writeln('Peremeshannie elementi massiva:');
i:=1;
while i<=n do
begin
t:=random(n)+1;
if i=1 then
begin
k1[i]:=t;
d1[i]:= d[t];
write(d1[i],' ');
inc(i);
end
else
begin
j:=1;
h:=0;
while j<i do
begin
if k1[j]=t then inc(h);
inc(j);
end;
if h=0 then
begin
k1[i]:=t;
d1[i]:= d[t];
write(d1[i],' ');
inc(i);
end;
end;
end;
writeln;

//sort {вот здесь идет возвращение былого порядка}
for i:=1 to n do
begin
t:=k1[i];
j:=i-1;
while (t<k1[j]) do
begin
k1[j+1]:=k1[j];
dec(j);
end;
k1[j+1]:=t;
t:=d1[j];
d1[j]:=d1[j+1];
d1[j+1]:=t;
end;

writeln('Elementi v vostanovlennom poryadke:');
for i:=1 to n do write(d1[i],' ');
readln;
end.

Автор: volvo 8.06.2006 14:55

То есть, фактически, задача сводится к следующему:

type
artype=array [1..20] of byte;
var
n,i,t:byte;
k, d: artype;
indexes: set of byte;

begin
write('Enter the number of elements '); readln(n);
randomize;

// create
writeln('Ishodniy massiv:');
for i:=1 to n do begin
d[i]:=random(20);
write(d[i],' ' );
k[i]:=i;
end;
writeln;

// mix
writeln('Peremeshannie elementi massiva:');
indexes := [];
for i := 1 to n do begin
repeat
T := random(n) + 1;
until not (T in indexes);
indexes := indexes + [T];
k[i] := T;
end;

for i := 1 to n do
write(d[k[i]], ' ');
writeln;

writeln('Elementi v vostanovlennom poryadke:');
for i := 1 to n do
write(d[i],' ');
readln;
end.

?

Автор: Malice 8.06.2006 14:59

Цитата(Tribunal @ 8.06.2006 6:53) *
но я явно как-то неправильно связываю сортировку массива номеров с перемещением эл-тов в основном массиве.только вот ничего другого никак придумать не могу...помогите,пожалуйста...

Во-первых: тебе не нужны массивы kl и dl, если бы можно было их использовать, то можно не делать сортировку, а сохранить в них и переписать обратно. При перемешивании массива D меняешь также и массив K. когда возвращаешь назад, то сортируешь по K, меняешь в обоих массивах. Примерно так:

Перемешал:
for i:=1 to n do begin
j:=random(n)+1;
t:=d[i]; d[i]:=d[j]; d[j]:=t;
t:=k[i]; k[i]:=k[j]; k[j]:=t;
end;

Вернул на место:
for i:=1 to n-1 do
for j:=i+1 to n do
if k[i]>k[j] then begin
t:=d[i]; d[i]:=d[j]; d[j]:=t;
t:=k[i]; k[i]:=k[j]; k[j]:=t;
end;

Автор: Tribunal 8.06.2006 15:50

да,действительно...спасибо)