コード例 #1
0
ファイル: main.c プロジェクト: sinitcin/CLearn
/* iqsort: сортирует v[left]...v[right] по возрастанию */
void iqsort(void *v[], int left, int right, int (*comp)(void *, void *)) {

    int i, last;
    void swap(void *v[], int, int);
    if (left >= right) /* ничего не делается, если */
        return; /* в массиве менее двух элементов */
    swap(v, left, (left + right )/2);last = left;
    for (i = left+1; i <= right; i++)
        if ((*comp)(v[i], v[left]) < 0)
             swap(v, ++last, i);
    swap(v, left, last);
    iqsort(v, left, last-1, comp);
    iqsort(v, last+1, right, comp);
}
コード例 #2
0
ファイル: iqsort.C プロジェクト: gitter-badger/quinoa
void index_qsort(const T v[], INT iv[], size_t N)
{
  if (N <=1 ) return;
  iqsort(v, iv, 0, N-1);
  iisort(v, iv, N);
  check(v, iv, N);
}
コード例 #3
0
ファイル: RowCollection.cpp プロジェクト: Myasuka/scidb
void RowCollection<Group,Hash>::sortAllRows(uint32_t attrId, TypeId typeId, RowCollection<Group, Hash>* sortedArray) {
    assert(_mode == RowCollectionModeRead);

    CompareValueVectorsByOneValue compareValueVectors(attrId, typeId);

    for (size_t rowId=0; rowId<_counts.size(); ++rowId) {
        // Copy out all the items in the row.
        // Non-null items are pushed to 'items'.
        // Null items are pushed to 'nullItems'.
        vector<vector<Value> > items;
        vector<vector<Value> > nullItems;
        getWholeRow(rowId, items, true, attrId, &nullItems);    // true = separateNull

        // Sort.
        iqsort(&items[0], items.size(), compareValueVectors);

        // Push the nullItems at the end.
        for (size_t i=0; i<nullItems.size(); ++i) {
            items.push_back(nullItems[i]);
        }

        // Append to new array
        for (size_t i=0; i<items.size(); ++i) {
            sortedArray->appendItem(rowId, Group(), items[i]);
        }
    }
}
コード例 #4
0
void dbSelection::sort(dbDatabase* db, dbOrderByNode* order)
{
    size_t n = nRows;
    if (n <= 1) { 
        return;
    }
    TRACE_MSG(("Sort %d records\n", n));
    ObjectRef* refs = new ObjectRef[n];
    segment *seg;
    int k = 0;
    for (seg = first; seg != NULL; seg = seg->next) { 
        for (int i = 0, nr = seg->nRows; i < nr; i++) {
            refs[k++].oid = seg->rows[i];
        }
    }
    dbSortContext ctx;
    ctx.order = order;
    sortThreadContext.set(&ctx);    
    iqsort(refs, n);
    k = 0;
    for (seg = first; seg != NULL; seg = seg->next) { 
        for (int i = 0, nr = seg->nRows; i < nr; i++) {
            seg->rows[i] = refs[k++].oid;
        }
    }
    delete[] refs;
}
コード例 #5
0
ファイル: iqsort.C プロジェクト: bartlettroscoe/seacas
template <typename T, typename INT> void index_qsort(const T v[], INT iv[], size_t N)
{
  if (N <= 1)
    return;
  iqsort(v, iv, 0, N - 1);
  iisort(v, iv, N);
  check(v, iv, N);
}
コード例 #6
0
ファイル: main.c プロジェクト: sinitcin/CLearn
/* сортировка строк */
int main(int argc, char *argv[])
{
    int nlines; /* количество прочитанных строк */
    int numeric = 0; /* 1, если сорт, по числ. знач. */
    extern int reverse;
    for (int i = 0; i < argc; i++) {
        if (argc > 1 && strcmp(argv[i], "-n") == 0) {
            numeric = 1;
        } else if (argc > 1 && strcmp(argv[i], "-r") == 0) {
            reverse = 1;
        }
    }
    if ((nlines = readlines(lineptr, MAXLINES)) >= 0) {
        iqsort((void **) lineptr, 0, nlines-1, (int (*)(void*, void*))(numeric ? inumcmp : istrcmp));
        writelines(lineptr, nlines);
        return 0;
    } else {
        printf("Введено слишком много строк\n");
        return 1;
    }
}