Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

сортировка [D7]


qoop ©   (2006-09-09 15:55:00) 

 PUUUType = ^TUUUType;
 TUUUType = record
   SomeData: string;
   LastTimeMs: DWord;
   Numbers: DWord;
 end;

 UUUTypes = array of PUUUType;


Есть массив заполненных записей, необходимо грамотно и быстро выбрать из этого массива наилучшую запись соответствующую например такому правилу: Numbers <- Min; ListeTimeMs <- Min

Т.е. найти в этом массиве запись с наименьшими значениями этих двух параметров. Очень нужен хороший и быстрый способ.


palva   (2006-09-09 18:23:00) [1]

Будет. Только буква i уже занята под параметр цикла. Используйте например i_min. И перед циклом надо дать начальное значение индексу:
i_min := Low(UUUTypes);


qoop   (2006-09-09 18:00:00) [2]


> Так можно, если индекс найденной записи вас не интересует.

А что-то в конструкции изменит, если мне потребуется и индекс сохранить. Я полагаю, что просто сделаю вот так и это будет корректно работать. Я прав?


var
i, FIndex: LongWord;
...
begin
...
if (Numbers < UUUSpeed.Numbers) or (Numbers = UUUSpeed.Numbers) and ListeTimeMs < UUUSpeed.ListeTimeMs) then
 begin
  UUUSpeed := UUUTypes[i];
  FIndex := i;
 end;


palva   (2006-09-09 17:27:00) [3]

Так можно, если индекс найденной записи вас не интересует. Только надо сделать начальное присваивание UUUSpeed, и проверять СНАЧАЛА один параметр, потом другой. Что у вас будет сначала - сами решайте.

var
i: LongWord;
UUUSpeed: TUUUType;
begin
UUUSpeed := UUUTypes[Low(UUUTypes)]
for i := Low(UUUTypes) + 1 to High(UUUTypes) do
  with UUUTypes[i] do
  begin
    if (Numbers < UUUSpeed.Numbers) or
      (Numbers = UUUSpeed.Numbers) and (ListeTimeMs < UUUSpeed.ListeTimeMs) then
      UUUSpeed := UUUTypes[i];
  end;
end;


qoop   (2006-09-09 17:13:00) [4]

Я бред какой-то кодом написал наверное. Да я понимаю принцип, я сравниваю сразу два условия, вот мой код, но я не уверен в его оптимальности и быстроте. Может что подскажете?

var
 i: LongWord;
 UUUSpeed: TUUUType;
begin
for i := Low(UUUTypes) to High(UUUTypes) do
   with UUUTypes[i] do
   begin
     if (Numbers < UUUSpeed.Numbers) and (ListeTimeMs < UUUSpeed.ListeTimeMs) then
       UUUSpeed := UUUTypes[i];
   end;
end;


palva   (2006-09-09 17:00:00) [5]

Задача не совсем определенная. Возможно, что минимальный Numbers у одной записи, а минимальный ListeTimeMs - у другой. Нужно определиться что для вас важнее, после чего к примеру нужно искать сначала записи с минимальным Numbers, а уже среди них с минимальным ListeTimeMs. Сортировать записи для этого не требуется. Просто просматривайте записи сверху в низ и держите в отдельной переменной индекс записи-кандидата. Если очередная запись "меньше" чем кандидат, то замените кандидата (замените индекс). После окончания просмотра у вас будет минимальный элемент.


qoop   (2006-09-09 16:43:00) [6]

Ну-же господа, подскажите!


Наверх

Титульная страница Поиск, карта сайта Написать письмо