void Bid::sortFrom(int begin, int end, unsigned *tempArray) { if (begin < end) { int middle = (begin + end) / 2; sortFrom (begin, middle, tempArray); sortFrom (middle + 1, end, tempArray); merge (begin, middle + 1, end, tempArray); } }
void Bid::sort() { if (sorted) return; unsigned *tempArray = new unsigned[num_goods]; sortFrom(0, num_goods-1, tempArray); delete[] tempArray; sorted = true; }
list left = list_create(); list right = list_create(); void *pivot = list_getFrom(l, p); int i = 0; FOREACH(it, l) { void *val = VALUE(it); if (i != p) { if (sorter(val, pivot)) { list_push(left, val); } else { list_push(right, val); } } i++; } list r = sortFrom(left, sorter, 0, list_len(left)); list_push(r, pivot); r = list_merge(r, sortFrom(right, sorter, 0, list_len(right))); list_destroy(left); list_destroy(right); return r; } list sortFrom(list l, sort_fn sorter, int s, int e) { switch (e - s) { case 0: return list_create(); case 1: return sortOne(l, sorter, s, e); case 2: return sortTwo(l, sorter, s, e);