void Merge(SortArray& A, size_t lo, size_t mid, size_t hi) { // mark merge boundaries A.mark(lo); A.mark(mid,3); A.mark(hi-1); // allocate output std::vector<value_type> out(hi-lo); // merge size_t i = lo, j = mid, o = 0; // first and second halves while (i < mid && j < hi) { // copy out for fewer time steps value_type ai = A[i], aj = A[j]; out[o++] = (ai < aj ? (++i, ai) : (++j, aj)); } // copy rest while (i < mid) out[o++] = A[i++]; while (j < hi) out[o++] = A[j++]; ASSERT(o == hi-lo); A.unmark(mid); // copy back for (i = 0; i < hi-lo; ++i) A.set(lo + i, out[i]); A.unmark(lo); A.unmark(hi-1); }
// with extra item on stack void InsertionSort2(SortArray& A) { for (size_t i = 1; i < A.size(); ++i) { value_type tmp, key = A[i]; A.mark(i); ssize_t j = i - 1; while (j >= 0 && (tmp = A[j]) > key) { A.set(j + 1, tmp); j--; } A.set(j + 1, key); A.unmark(i); } }
void ShellSort(SortArray& A) { size_t incs[16] = { 1391376, 463792, 198768, 86961, 33936, 13776, 4592, 1968, 861, 336, 112, 48, 21, 7, 3, 1 }; for (size_t k = 0; k < 16; k++) { for (size_t h = incs[k], i = h; i < A.size(); i++) { value_type v = A[i]; size_t j = i; while (j >= h && A[j-h] > v) { A.set(j, A[j-h]); j -= h; } A.set(j, v); } } }