Массив записей: сортировка.

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Массив записей: сортировка.

Сообщение wofs » 27.12.2017 13:49:24

Доброго дня!
Есть функция сортировки:
Код: Выделить всё
  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 | Игровые и спортивные комплексы, горки
Аватара пользователя
wofs
постоялец
 
Сообщения: 248
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Re: Массив записей: сортировка.

Сообщение Sergei I. Gorelkin » 27.12.2017 15:47:39

Дело не в "смешанных числах", а в том, что первый элемент не участвует в сортировке, т.к. внешний цикл начинается с 1 вместо 0.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1372
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Массив записей: сортировка.

Сообщение wofs » 28.12.2017 12:46:50

Sergei I. Gorelkin писал(а):Дело не в "смешанных числах", а в том, что первый элемент не участвует в сортировке, т.к. внешний цикл начинается с 1 вместо 0.

Хм.. вы правы - невнимательность и неуверенность в теории :( Спасибо.
Аватара пользователя
wofs
постоялец
 
Сообщения: 248
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

Рейтинг@Mail.ru