![]() |
#1 |
Участник
|
Сортировка контейнеров
Всегда не хватало сортировки контейнеров в DAX. Только руки дошли написать.
Навеяно http://gatesasbait.wordpress.com/200...n-a-container/ можно указывать несколько полей для сортировки (контейнер индексов). X++: //class Global static container quickSort( container _qsc, container _cIndexKey = [1], int _qsstart = 1, int _qsend = conlen(_qsc) ) { int qsi = _qsstart; int qsj = _qsend; container qsx; container qsKey; boolean less(container _c1, container _c2) { int qsk; int idx; ; for (qsk=1; qsk<=conlen(_cIndexKey); qsk++) { idx = conpeek(_cIndexKey, qsk); if (conpeek(_c1, idx) < conpeek(_c2, idx)) return true; if (conpeek(_c1, idx) > conpeek(_c2, idx)) return false; } return false; } ; qsx = conpeek(_qsc, (_qsstart +_qsend)/2); do { qsKey = conpeek(_qsc, qsi); while (less(qsKey, qsx)) { qsi++; if (qsi <= conlen(_qsc)) { qsKey = conpeek(_qsc, qsi); } else { break; } } qsKey = conpeek(_qsc, qsj); while (less(qsx, qsKey)) { qsj = qsj - 1; if (qsi > 0) { qsKey = conpeek(_qsc, qsj); } else { break; } } if (qsi <= qsj) { qsKey = conpeek(_qsc, qsi); _qsc = conpoke(_qsc, qsi, conpeek(_qsc, qsj)); _qsc = conpoke(_qsc, qsj, qsKey); qsi++; qsj = qsj - 1; } } while (qsi <= qsj); if (_qsstart < qsj) { _qsc = Global::quickSort(_qsc, _cIndexKey, _qsstart, qsj); } if (qsi < _qsend) { _qsc = Global::quickSort(_qsc, _cIndexKey, qsi, _qsend); } return _qsc; } X++: container c = [ [2, 3], [5, 2], [1, 2], [20, 2], [10, 2] ]; c = quickSort(c, [2,1]); //[ [1, 2], [5, 2], [10, 2], [20, 2], [2, 3] ] c = quickSort(c); //[ [1, 2], [2, 3], [5, 2], [10, 2], [20, 2] ] |
|
|
За это сообщение автора поблагодарили: S.Kuskov (3). |