| Новости | 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]]