Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.01.2010, 14:41   #1
antoha73
Пользователь
 
Регистрация: 20.12.2009
Сообщений: 14
По умолчанию Сортировка двух массивов одновременно

Во общем вопрос в следующем, есть два массива:

1) TMPZak: array[1..1000] of String;
2) TMPOrder: array[1..1000] of Integer;


Необходимо отсортировать первый массив (TMPZak) по убыванию элементов второго массива (TMPOrder)...
Как лучше это сделать при условии что массивы большие по размерности?
antoha73 вне форума Ответить с цитированием
Старый 03.01.2010, 14:52   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Сортировку одного из массивов (думаю это строки) хотя разницы нет, вывести в отдельный поток, другой массив (если у вас не интерфейсное приложение) сортировать в главном потоке, по окончании синхронизировать с дочерним.
BOBAH13 вне форума Ответить с цитированием
Старый 03.01.2010, 14:55   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

так Вы же сами себе ответили, когда тему создавали..
Вы один массив сортировать умеете?
вот и сортируйте его по убыванию, хотя бы тем же "пузырьком", но при каждой операции обмена элементов в массиве TMPOrder меняйте порядок в TMPZak. Это если по-простому...
Если чуть-чуть сложнее - то можно завести ещё один массив из integer, заполнить его числами от 1 до 1000 (или подозреваю, что 1000 взята с запасом и в какой-то переменной находится число, сколько реально элементов в массивах TMPOrder/TMPZak - тогда до этого числа.) И тогда при сортировке массива TMPOrder одновеременно менять местами элементы не в TMPZak, а в этом TMPZakIndex... надеюсь, идея понятна? Или проиллюстрировать кодом?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.01.2010, 14:56   #4
antoha73
Пользователь
 
Регистрация: 20.12.2009
Сообщений: 14
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Сортировку одного из массивов (думаю это строки) хотя разницы нет, вывести в отдельный поток, другой массив (если у вас не интерфейсное приложение) сортировать в главном потоке, по окончании синхронизировать с дочерним.
Приложение интерфейсное...
antoha73 вне форума Ответить с цитированием
Старый 03.01.2010, 14:57   #5
antoha73
Пользователь
 
Регистрация: 20.12.2009
Сообщений: 14
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Или проиллюстрировать кодом?
Был бы очень признателен )
antoha73 вне форума Ответить с цитированием
Старый 03.01.2010, 15:23   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Да не проблема...
вот (код консольный - но ввод/вывод в данном случае для понимания алогоритма не нужны... впрочем, так же как и заполнение массивов... это тоже для алгоритма неважно!)
Код:
uses CRT;

 function IntToStr(i : integer):string;
 var s : string;
 begin
   str(i,s);
   IntToStr := s;
 end;

var
 i,j,sum, IndexMax : integer;
 TMPZak: array[1..1000] of String[30];
 TMPOrder: array[1..1000] of Integer;
 TMPZakIndex: array[1..1000] of Integer;
 tmpVar : integer;

begin

  randomize;
  {просто заполнение массивов}
  for i:=1 to 10 do
    TMPZak[i] := 'Строка № '+IntToStr(i);
  for i:=1 to 10 do
     TMPOrder[i] := random(100);

  writeln('Массив TMPOrder до сортировки:');
  for i:=1 to 10 do
    Write(TMPOrder[i]:3);
  writeln;


  {массивы заполнены, теперь собственно алгоритм}

  {сначала проиницилизируем TMPZakIndex}
  for i:=1 to 1000 do TMPZakIndex[i] := i;

  {теперь собственно сортировка}

  {сортировка методом "пузырька" (методом простого выбора )

  Выбирается максимальный элемент массива
  и меняется местами с первым элементом массива.
  Затем процесс повторяется с оставшимися элементами и т. д. }

  for i:=1 to 10 do begin
    IndexMax := i; {предварительно считаем, что первый элемент наибольший}
    {ищем индекс максимального элемента}
    for j:=i+1 to 10 do
      if TMPOrder[j]>TMPOrder[IndexMax] then IndexMax := j;

    {меняем местами элементы массива с индексами i и IndexMax
    (ну, если они не равны, конечно) }
    if i<>IndexMax then begin
      tmpVar := TMPOrder[IndexMax];
      TMPOrder[IndexMax] := TMPOrder[i];
      TMPOrder[i] := tmpVar;

      tmpVar := TMPZakIndex[IndexMax];
      TMPZakIndex[IndexMax] := TMPZakIndex[i];
      TMPZakIndex[i] := tmpVar;
    end;
  end;

  {всё. сортировка завершена}

  writeln('Массив TMPOrder после сортировки:');
  for i:=1 to 10 do
    Write(TMPOrder[i]:3);
  writeln;

  {для проверки выведем строки из TMPZak в порядке убывания элементов TMPOrder}
  for i:=1 to 10 do
    writeln('#',i:1,' : ',TMPZak[TmpZakIndex[i]]);

end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.01.2010, 15:35   #7
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Не перестаю удивляться - почему люди не видят под самым носом?
Есть готовый пример - ..\Delphi7\Demos\Threads
mihali4 вне форума Ответить с цитированием
Старый 03.01.2010, 15:53   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Есть готовый пример - ..\Delphi7\Demos\Threads
mihali4, я, конечно, могу ошибаться, но в этой задаче TC параллельные алгоритмы/потоки вообще не нужны - ему надо было один массив отсортировать по элементам другого массива.. и всё... ну, по крайней мере, я именно такую задачу ему решил
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.01.2010, 16:05   #9
antoha73
Пользователь
 
Регистрация: 20.12.2009
Сообщений: 14
По умолчанию

i-количество элементов в массиве

Код:
    for indeks:=1 to i do begin
    IndexMax := indeks;
     for j:=indeks+1 to i do
     if TMPOrder[j]>TMPOrder[IndexMax] then IndexMax := j;
      if indeks<>IndexMax then begin

      tmpVar := TMPOrder[IndexMax];
      TMPOrder[IndexMax] := TMPOrder[indeks];
      TMPOrder[indeks] := tmpVar;

      tmpVar := TMPZakIndex[IndexMax];
      TMPZakIndex[IndexMax] := TMPZakIndex[indeks];
      TMPZakIndex[indeks] := tmpVar;
    end;
  end;


for indeks:=1 to i do showmessage(inttostr(TMPOrder[TmpZakIndex[indeks]]));
Мессага выводит, что массив по убыванию не отсортировался, где ошибка?

У нас принято оформлять код специальным тэгом - при помощи кнопочки "#".
Вы не знали? Почитайте правила раздела...
Модератор

Последний раз редактировалось antoha73; 03.01.2010 в 21:09.
antoha73 вне форума Ответить с цитированием
Старый 03.01.2010, 17:32   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

вроде всё хорошо.
два замечания.
1) вы не забыли проиницилизировать (заполнить) массив TmpZakIndex циферками от 1 до i ???
2) проверьте, массив TMPOrder отсортировался по убыванию?!
3) если первые два пункта не при чём - давайте код полностью!

ДОБАВЛЕНО
ААААА!
я понял, что у Вас не так!!
for indeks:=1 to i do showmessage(inttostr(TMPOrder[TmpZakIndex[indeks]]));
TMPOrder ОТСОРТИРОВАН!!!
его надо выводить просто по порядку:
for indeks:=1 to i do showmessage(inttostr(TMPOrder[indeks]));

а в TmpZakIndex порядок НЕСОРТИРОВАННОГО изначально массива (в нашем случае это массив строк -TMPZak:
Код:
for indeks:=1 to i do showmessage(TMPZak[TmpZakIndex[indeks]]);

Последний раз редактировалось Serge_Bliznykov; 03.01.2010 в 17:38.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Слияние двух массивов в Delphi sauron99 Помощь студентам 17 03.04.2016 09:37
Обращение к таблице одновременно двух AdoQuery Joe_Tribbiani БД в Delphi 1 01.06.2009 17:27
Деление элементов двух массивов при зад. условиях Leona_L Microsoft Office Excel 6 03.04.2009 20:52
Перенести общие елементы двух массивов в другой. leshax Общие вопросы C/C++ 1 04.02.2009 20:57
Выбрать из двух массивов совпадение. *Иван* Microsoft Office Excel 7 22.11.2007 21:10