Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
3-1248764936
tomkat
2009-07-28 11:08
2010.12.19
экспорт метаданных FireBird в скрипт


6-1231363825
Tinky
2009-01-08 00:30
2010.12.19
Сниффер loopback


15-1284292953
sniknik
2010-09-12 16:02
2010.12.19
Отключается копирование в буфер...


15-1284097942
Palladin
2010-09-10 09:52
2010.12.19
Opera 10.62


2-1285224640
Сергей
2010-09-23 10:50
2010.12.19
подсказка в DBGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский