![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Переставить элементы
PRIVET123 © (2010-09-27 11:57:00)есть массив 0..n элементов, и есть массив адресов, где должны стоять ячейки первого массива -
a[0]=значениеX, b[0]=адресX, и так все элементы 0..n
надо сделать
a[адресX]=значениеX,
то есть переставить согласно адресов. можно это сделать без привлечения промежуточного массива, сразу, на месте?
может как то обменивать элементы, сохранять в какой то временной переменной?
Sha (2010-09-27 15:08:00) [1]> И. Павел © (27.09.10 13:16) [14]
> Если элемент обменен, то b[]:=0.
безопаснееb[i]:=i;т.к. у автора нулевой индекс используется.
Sha (2010-09-27 14:39:00) [2]> PRIVET123
Если массив b ты сам создаешь, то имей в виду,
что все было бы намного проще и быстрее,
если бы он содержал не "индексы, куда ставить",
а "индексы, откуда ставить".
Sha (2010-09-27 14:22:00) [3]еще вариант
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;
И. Павел (2010-09-27 13:36:00) [4]Кажется, вот такой код работает:
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;
И. Павел (2010-09-27 13:16:00) [5]> то есть обменивать местами не только элементы а, но и синхронно
> элементы б?
Если элемент обменен, то b[]:=0. Если нашли b[] = 0, значит - конец текущей петли. Ищем новую (любой элемент с b[] <>0 и нечинаем раскручивать ее ).
PRIVET123 (2010-09-27 13:14:00) [6]Sha
то есть обменивать местами не только элементы а, но и синхронно элементы б?
одноразовый массив б, но и ладно.
ок, спасибо, понятно.
Sha (2010-09-27 13:09:00) [7]Пройти, если разрешить портить b.
Sha (2010-09-27 13:05:00) [8]так попробуй
var b: array [1..10] of integer = (2, 1, 4, 5, 10, 7, 8, 6, 8, 3);
И. Павел (2010-09-27 13:05:00) [9]Те же петли... Все верно, выходит: последовательно не пройти...
И. Павел (2010-09-27 13:03:00) [10]Опять что-то не то...
И. Павел (2010-09-27 13:01:00) [11]Вот:
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;
PRIVET123 (2010-09-27 13:01:00) [12]То есть что, через рекурсию? А если размер массива очень большой, то рекурсии хватит памяти запоминать, что сначала что потом переставлять?
Sha (2010-09-27 12:54:00) [13]> И. Павел © (27.09.10 12:48) [5]
Цепочек может быть несколько.
Если нет никакой закономерности, их отслеживание превращается в проблему.
И. Павел (2010-09-27 12:48:00) [14]> [4] PRIVET123 (27.09.10 12:39)
Проверил - не сработало так как я думал...
Можно так: смотрим, кужа нужно переставить первый элемент - переставляем его туда (на позицию A). А элемент из позиции A тоже нужно переставить - смотрим - куда - на позицию B - переставляем егоь туда (не забыв перед этим запомнить прежний элемент из позиции B, который в свою очередь переставляем туда, куда написано а b[B] и т.д.)
PRIVET123 (2010-09-27 12:39:00) [15]И. Павел
но если обменивать, то нарушается же принцип -
второй массив указывает, где должен стоять не переставленный элемент первого массива.
я запутался, вот и спрашиваю :)
И. Павел (2010-09-27 12:36:00) [16]> Записывайте в a[0] значение из b[0].
тоесть:
temp := a[адресХ]
a[адресX]=a[0]
a[0]:=temp
и т.д.
И. Павел (2010-09-27 12:35:00) [17]> [0] PRIVET123 (27.09.10 11:57)
Записывайте в a[0] значение из b[0]. Дальше, кажется, все доложно встать на свои места, так что последний элемент даже можно будет не присваивать - он сам заполнится. Хотя это проверить нужно... может такой подход и не сработает...
Ega23 (2010-09-27 12:20:00) [18]Массив на 4 миллиарда элементов - не многовато-ли?