Форум: "Начинающим";
Текущий архив: 2010.12.19;
Скачать: [xml.tar.bz2];
ВнизПереставить элементы Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.004 c