Есть функция сортировки:
- Код: Выделить всё
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 | Игровые и спортивные комплексы, горки