Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.12.19;
Скачать: CL | DM;

Вниз

Переставить элементы   Найти похожие ветки 

 
PRIVET123   (2010-09-27 11:57) [0]

есть массив 0..n элементов, и есть массив адресов, где должны стоять ячейки первого массива -
a[0]=значениеX, b[0]=адресX,  и так все элементы 0..n
надо сделать
a[адресX]=значениеX,

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


 
Ega23 ©   (2010-09-27 12:20) [1]

Массив на 4 миллиарда элементов - не многовато-ли?


 
И. Павел ©   (2010-09-27 12:35) [2]

> [0] PRIVET123   (27.09.10 11:57)

Записывайте в a[0] значение из b[0]. Дальше, кажется, все доложно встать на свои места, так что последний элемент даже можно будет не присваивать - он сам заполнится. Хотя это проверить нужно... может такой подход и не сработает...


 
И. Павел ©   (2010-09-27 12:36) [3]

> Записывайте в a[0] значение из b[0].

тоесть:
temp := a[адресХ]
a[адресX]=a[0]
a[0]:=temp

и т.д.


 
PRIVET123   (2010-09-27 12:39) [4]

И. Павел
но если обменивать, то нарушается же принцип -
второй массив указывает, где должен стоять не переставленный элемент первого массива.
я запутался, вот и спрашиваю :)


 
И. Павел ©   (2010-09-27 12:48) [5]

> [4] PRIVET123   (27.09.10 12:39)

Проверил - не сработало так как я думал...

Можно так: смотрим, кужа нужно переставить первый элемент - переставляем его туда (на позицию A). А элемент из позиции A тоже нужно переставить - смотрим - куда - на позицию B - переставляем егоь туда (не забыв перед этим запомнить прежний элемент из позиции B, который в свою очередь переставляем туда, куда написано а b[B] и т.д.)


 
Sha ©   (2010-09-27 12:54) [6]

> И. Павел ©   (27.09.10 12:48) [5]

Цепочек может быть несколько.
Если нет никакой закономерности, их отслеживание превращается в проблему.


 
PRIVET123   (2010-09-27 13:01) [7]

То есть что, через рекурсию? А если размер массива очень большой, то рекурсии хватит памяти запоминать, что сначала что потом переставлять?


 
И. Павел ©   (2010-09-27 13:01) [8]

Вот:

var a: array [1..10] of integer = (2, 10, 4, 5, 1, 7, 8, 6, 8, 3);
var b: array [1..10] of integer = (2, 10, 4, 5, 1, 7, 8, 6, 8, 3);

procedure TForm1.Button1Click(Sender: TObject);
var i, j, temp1, temp2: integer;
begin
 for i := 1 to 9 do
 begin
   temp1 := a[b[1]];
   temp2 := b[b[1]];
   a[b[1]] := a[1];
   b[b[1]] := b[1];
   a[1] := temp1;
   b[1] := temp2;
 Caption := "";
 for j := 1 to 10 do
   Caption := Caption + " " + IntToStr(a[j]);
 Memo1.Lines.Add(Caption);
 end;
end;


 
И. Павел ©   (2010-09-27 13:03) [9]

Опять что-то не то...


 
Sha ©   (2010-09-27 13:05) [10]

так попробуй
var b: array [1..10] of integer = (2, 1, 4, 5, 10, 7, 8, 6, 8, 3);


 
И. Павел ©   (2010-09-27 13:05) [11]

Те же петли... Все верно, выходит: последовательно не пройти...


 
Sha ©   (2010-09-27 13:09) [12]

Пройти, если разрешить портить b.


 
PRIVET123   (2010-09-27 13:14) [13]

Sha
то есть обменивать местами не только элементы а, но и синхронно элементы б?
одноразовый массив б, но и ладно.

ок, спасибо, понятно.


 
И. Павел ©   (2010-09-27 13:16) [14]

> то есть обменивать местами не только элементы а, но и синхронно
> элементы б?

Если элемент обменен, то b[]:=0. Если нашли b[] = 0, значит - конец текущей петли. Ищем новую (любой элемент с b[] <>0 и нечинаем раскручивать ее ).


 
И. Павел ©   (2010-09-27 13:36) [15]

Кажется, вот такой код работает:

var a: array [1..10] of integer = (2, 1, 4, 5, 10, 7, 8, 6, 9, 3);
var b: array [1..10] of integer = (2, 1, 4, 5, 10, 7, 8, 6, 9, 3);

procedure TForm1.Button1Click(Sender: TObject);
var i, j, k, cur, value, temp1, temp2: integer;
   ok: boolean;
begin
 ok := false;
 cur := b[1];
 value := a[1];
 repeat
   temp1 := a[cur];
   temp2 := b[cur];
   a[cur] := value;
   b[cur] := 0;
   cur := temp2;
   value := temp1;

   if cur = 0 then
     for k := 1 to 10 do
     begin
       if b[k] <> 0 then
       begin
         cur := b[k];
         value := a[k];
         break;
       end;
       if k = 10 then ok := true;
     end;
 until ok;

 Caption := "";
 for k := 1 to 10 do
   Caption := Caption + " " + IntToStr(a[k]);
 Memo1.Lines.Add(Caption);
end;


 
Sha ©   (2010-09-27 14:22) [16]

еще вариант
 
 for i:=low(b) to high(b) do begin;
   bb:=b[i];
   if bb<>i then begin;
     b[i]:=i;
     aa:=a[i];
     repeat;
       aaa:=a[bb]; a[bb]:=aa; aa:=aaa;
       bbb:=bb; bb:=b[bb]; b[bbb]:=bbb;
       until bb=bbb;
     end;
   end;


 
Sha ©   (2010-09-27 14:39) [17]

> PRIVET123

Если массив b ты сам создаешь, то имей в виду,
что все было бы намного проще и быстрее,
если бы он содержал не "индексы, куда ставить",
а "индексы, откуда ставить".


 
Sha ©   (2010-09-27 15:08) [18]

> И. Павел ©   (27.09.10 13:16) [14]
> Если элемент обменен, то b[]:=0.

безопаснее b[i]:=i; т.к. у автора нулевой индекс используется.



Страницы: 1 вся ветка

Текущий архив: 2010.12.19;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.008 c
15-1283792261
Делфиец
2010-09-06 20:57
2010.12.19
Байкал на Десктоп


2-1285159212
Darvin
2010-09-22 16:40
2010.12.19
Длина файла с путем больше 260 байт


15-1283798468
Юрий Зотов
2010-09-06 22:41
2010.12.19
На этот раз - транзакции


2-1285574236
PRIVET123
2010-09-27 11:57
2010.12.19
Переставить элементы


15-1284112113
Empleado
2010-09-10 13:48
2010.12.19
Остались ли еще бесплатные proxy?