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

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

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

Ответить
Аватара пользователя
wofs
постоялец
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань
Контактная информация:

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

Сообщение wofs »

Доброго дня!
Есть функция сортировки:

Код: Выделить всё

  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 | Игровые и спортивные комплексы, горки
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Дело не в "смешанных числах", а в том, что первый элемент не участвует в сортировке, т.к. внешний цикл начинается с 1 вместо 0.
Аватара пользователя
wofs
постоялец
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань
Контактная информация:

Сообщение wofs »

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

Хм.. вы правы - невнимательность и неуверенность в теории :( Спасибо.
Ответить