В принципе есть преобразование Шварца (Randal L Schwartz)
которое как бы пригодно для большинства случаев сортировки
включая многоуровневые сортировки и пр

лучше это найти, если нужно для дела

Всем добрый день!

Никак не могу придумать алгоритм

Суть такая:
есть список объектов. У которых есть поле - порядок сортировки
например, можно изобразить это так
%a = (a=>0,b=>4,c=>10);
то есть объект a имеет индекс 0, объект b имеет индекс 4, с имеет 10
номер сортировки от 0 до 10

есть ещё один объект.
$s = (d=>1);
Его нужно вставить в список, не нарушив предидущий порядок, и чтобы индексы
не пересекались. Если порядки сортировки совпадают, то надо вставить перед
элементом в списке.
Поясню на примерах:

# исходный "массив"
%a = (a=>0,b=>4,c=>10);
$s = (d=>1);
# результат
%b = (a=>0,b=>4,c=>10, d=>1); #все просто

# исходный "массив"
%a = (a=>0,b=>4,c=>10);
$s = (d=>0);
# результат
%b = (d=>0, a=>1,b=>4,c=>10); #"d" встает на место "a", а "a" двигается в
право
# если "a" занимает чьето место, то и она должна тот элемент подвинуть и
т.д.


# исходный "массив"
%a = (a=>0,b=>4,c=>10);
$s = (d=>10);
# результат
%b = (a=>0,b=>4,c=>10, d=>9); # у "d" уменьшается индекс
# если "d" занимает чьето место, то должна тот элемент подвинуть и т.д.

# исходный "массив"
%a = (a=>0,b=>4,c=>10);
$s = (d=>4);
# результат
%b = (a=>0,b=>5,c=>10, d=>4);
# или такой
%b = (a=>0,b=>4,c=>10, d=>3);
# тут нет разницы куда встанет "d" на место "b" или перед ним

Вот что то даже не приходит в голову с чего начать.
В конечном итоге там список будет, а не хеш (я его для простоты нарисовал)
типа такого
@a = (
   {
name => a,
sort => 0,
},
   {
name => b,
sort => 4,
},
   {
name => c,
sort => 10,
},
);
Может есть что то стандартное для этих целей? Или мысль кто подкинет
полезную :)

------
С Уважением, Олег Малёваный


--
Moscow.pm mailing list
[email protected] | http://moscow.pm.org

Ответить