Есть функция сортировки:
- Код: Выделить всё
- var
 i,j,n: integer;
 tmp: TCategory;
 begin
 n:= High(aCategories);
 for i:=1 to n-1 do
 for j:=i+1 to n do
 if aCategories[i].parentId>aCategories[j].parentId then
 begin
 tmp:=aCategories[i];
 aCategories[i]:=aCategories[j];
 aCategories[j]:=tmp;
 end;
 Result:= aCategories;
Если в массиве нет записей с отрицательным значением сравниваемого поля, то все работает ок. Но стоит появиться такой записи - алгоритм дает сбой:
- Код: Выделить всё
- id | ParentId | Name
- Код: Выделить всё
- 1 | 0 | Бытовая техника
 0 | -1 | Root
 2 | 0 | Детские товары
 10 | 1 | Мелкая техника для кухни
 20 | 2 | Детский спорт
 102 | 10 | Мороженицы
 101 | 10 | Сэндвичницы и приборы для выпечки
 200 | 20 | Игровые и спортивные комплексы, горки
Отчего так происходит?
Добавлено спустя 1 час 5 минут 50 секунд:
Наткнулся на забугорном сайте на такую функцию сортировки:
- Код: Выделить всё
- function TYML.SortedCategoriesByParentId(aCategories: ArrayOfCategories): ArrayOfCategories;
 var
 bis, i, j, k : integer;
 temp: TCategory;
 begin
 if High(aCategories) > 0 then bis := High(aCategories) else exit;
 k := bis shr 1; // div 2
 while k > 0 do begin
 for i := 0 to bis -k do begin
 j := i;
 while j >= 0 do begin
 if aCategories[j].parentId <= aCategories[j +k].parentId then break;
 temp := aCategories[j];
 aCategories[j] := aCategories[j+k];
 aCategories[j+k] := temp;
 if j > k then Dec(j, k) else j := 0;
 end;
 end;
 k := k shr 1; // div 2
 end;
 Result:= aCategories;
 end;
Смешанные числа сортирует норм:
- Код: Выделить всё
- 0 | -1 | Root
 1 | 0 | Бытовая техника
 2 | 0 | Детские товары
 10 | 1 | Мелкая техника для кухни
 20 | 2 | Детский спорт
 102 | 10 | Мороженицы
 101 | 10 | Сэндвичницы и приборы для выпечки
 200 | 20 | Игровые и спортивные комплексы, горки





 Спасибо.
 Спасибо.