/* 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); }
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); }
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]); } } }
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; }
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); }
/* сортировка строк */ 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; } }