Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Эффективная организация отсортированного массива в Delphi

Delphi , Базы данных , Сортировка и Фильтр

При работе с массивами данных, которые должны быть всегда отсортированными, важно выбрать правильный подход к их организации и управлению. В этой статье мы рассмотрим эффективный способ поддержания отсортированного массива в Delphi, основанный на использовании TList и собственной функции сравнения.

Исходный код:

type
  TInfo = record
    Name: string;
    Price: Integer;
  end;

var
  Infos: array of TInfo;

function CompareInfo(Item1, Item2: Integer): Integer;
var
  i, j: Integer;
begin
  i := Item1;
  j := Item2;
  Result := CompareText(Infos[i].Name, Infos[j].Name);
end;

var
  SortedInfo: TList;

procedure InfoHandlerData(Sender: TObject; Item: TListItem);
begin
  Item.Caption := Infos[Integer(SortedInfo[Item.Index])].Name;
  Item.SubItems.Add(IntToStr(Infos[Integer(SortedInfo[Item.Index])].Price));
end;

begin
  // Заполнение массива Infos
  // ...

  // Создание TList и добавление в него указателей на элементы массива Infos
  SortedInfo := TList.Create;
  for I := 0 to High(Infos) do
    SortedInfo.Add(Pointer(I));

  // Сортировка TList с помощью собственной функции сравнения
  SortedInfo.Sort(TCompareInfo);

  // Использование SortedInfo для отображения данных в TListView
  // ...
end;

Проблема

При добавлении или удалении элементов массива Infos, указатели в TList становятся недействительными, и для поддержания отсортированного состояния необходимо пересоздавать TList и сортировать его снова. Это приводит к лишним операциям и может повлиять на производительность.

Решение

Для эффективной организации отсортированного массива в Delphi можно использовать алгоритм вставки (insertion sort) для поддержания порядка при добавлении новых элементов. При добавлении нового элемента, найдите правильное место для вставки в отсортированную часть массива, используя бинарный поиск (binary search) для определения позиции вставки. Это гарантирует, что массив останется отсортированным после каждой операции вставки.

При удалении элементов из массива, просто удалите элемент, не забывая обновить индексы других элементов, если необходимо. Удаление элемента из отсортированного массива не нарушает отсортированный порядок.

Пример кода с использованием алгоритма вставки:

procedure InsertionSort(var arr: array of TInfo);
var
  i, j: Integer;
  temp: TInfo;
begin
  for i := 1 to High(arr) do
  begin
    temp := arr[i];
    j := i - 1;
    while (j >= 0) and (CompareInfo(Pointer(j), Pointer(i)) > 0) do
    begin
      arr[j + 1] := arr[j];
      Dec(j);
    end;
    arr[j + 1] := temp;
  end;
end;

procedure AddToSortedArray(var arr: array of TInfo; newItem: TInfo);
var
  i: Integer;
begin
  i := High(arr) + 1;
  while (i > 0) and (CompareInfo(Pointer(i - 1), Pointer(newItem)) > 0) do
  begin
    arr[i] := arr[i - 1];
    Dec(i);
  end;
  arr[i] := newItem;
end;

procedure RemoveFromSortedArray(var arr: array of TInfo; index: Integer);
begin
  for var i := index to High(arr) - 1 do
    arr[i] := arr[i + 1];
  SetLength(arr, High(arr) - 1);
end;

Используйте процедуры InsertionSort, AddToSortedArray и RemoveFromSortedArray для управления отсортированным массивом Infos. При добавлении нового элемента воспользуйтесь AddToSortedArray, а при удалении - RemoveFromSortedArray. Если массив стал большим, и вы хотите поддерживать его в отсортированном состоянии, используйте InsertionSort для сортировки всего массива.

Вывод

основана на использовании TList и собственной функции сравнения, а также на применении алгоритма вставки для поддержания отсортированного состояния при добавлении или удалении элементов. Это гарантирует, что массив останется отсортированным после каждой операции вставки или удаления, без лишних операций сортировки.

Создано по материалам из источника по ссылке.

Эта статья описывает эффективный способ поддержания отсортированного массива в Delphi, используя TList и собственную функцию сравнения, а также алгоритм вставки для управления порядком при добавлении или удалении элементов.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Сортировка и Фильтр ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 15:33:16/0.0031309127807617/0