Новости | FAQ | Авторы | Документация | В действии | Библиотека |
Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
G_Z 29.05.2015 23:10 / 29.05.2015 23:15
Quick sort на Парсере.@sort[table;compare][locals] $data[^table.hash(^table.offset[])[$.type[table]]] $result[^table::create[$table;$.limit(0)]] ^qsort[$data;$compare](0;$table - 1) ^data.foreach[;row]{ ^result.join[$row] } @qsort[data;compare;left;right][locals] $base(($left + $right) \ 2) $baserow[$data.$base.fields] $l($left) $r($right) ^while($l <= $r){ ^while(^compare[$data.$l.fields;$baserow] < 0){ ^l.inc[] } ^while(^compare[$data.$r.fields;$baserow] > 0){ ^r.dec[] } ^if($l <= $r){ $tmp[$data.$l] $data.$l[$data.$r] $data.$r[$tmp] ^l.inc[] ^r.dec[] } } ^if($left < $r){ ^qsort[$data;$compare]($left;$r) } ^if($l < $right){ ^qsort[$data;$compare]($l;$right) }Пример функции сравнения:
@compare[one;two][locals] $result(0) $conditions[ $.a[ $.type[int] $.order[asc] ] $.b[ $.type[string] $.order[desc] ] ] ^conditions.foreach[column;properties]{ ^if($result == 0){ ^switch[$properties.type]{ ^case[int]{ ^if($one.$column > $two.$column){ $result(1) }($one.$column < $two.$column){ $result(-1) } } ^case[string;DEFAULT]{ ^if($one.$column gt $two.$column){ $result(1) }($one.$column lt $two.$column){ $result(-1) } } } ^if($properties.order eq 'desc'){ $result(-$result) } } }Пример:
$table[^table::create{a b}] ^for[i](1;100){ ^table.append{^math:random(10) ^math:uid64[]} } $sorted[^sort[$table;$compare]]