Помощь - Поиск - Пользователи - Календарь
Полная версия: Возвращение былого порядка массиву
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Tribunal
есть исходный массив и соответствующий ему массив номеров эл-тов.
нужно перемешать эл-ты массива номеров и в соответствии с ним основной массив.
затем вернуть его изначальный порядок.
вот то,что у меня получилось...
но я явно как-то неправильно связываю сортировку массива номеров с перемещением эл-тов в основном массиве.только вот ничего другого никак придумать не могу...помогите,пожалуйста...

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
То есть, фактически, задача сводится к следующему:
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
Цитата(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
да,действительно...спасибо)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.