[Moscow.pm] Вставка в спиоск в определенное место

German german на itkm.ru
Чт Дек 10 04:20:29 PST 2009


В принципе есть преобразование Шварца (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