Показать сообщение отдельно
Старый 10.01.2014, 19:09   #1  
kgksoft is offline
kgksoft
Участник
 
37 / 107 (4) +++++
Регистрация: 24.12.2003
Сортировка контейнеров
Всегда не хватало сортировки контейнеров в 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).