void QuickSortLR(SortArray& A, ssize_t lo, ssize_t hi) { // pick pivot and watch volatile ssize_t p = QuickSortSelectPivot(A, lo, hi+1); value_type pivot = A[p]; A.watch(&p, 2); volatile ssize_t i = lo, j = hi; A.watch(&i, 3); A.watch(&j, 3); while (i <= j) { while (A[i] < pivot) i++; while (A[j] > pivot) j--; if (i <= j) { A.swap(i,j); // follow pivot if it is swapped if (p == i) p = j; else if (p == j) p = i; i++, j--; } } A.unwatch_all(); if (lo < j) QuickSortLR(A, lo, j); if (i < hi) QuickSortLR(A, i, hi); }
void QuickSortLR(WSortView& a, ssize_t lo, ssize_t hi) { // pick pivot and watch volatile ssize_t p = QuickSortSelectPivot(a, lo, hi+1); value_type pivot = a[p]; a.watch(&p,1); volatile ssize_t i = lo, j = hi; a.watch(&i,2); a.watch(&j,2); while (i <= j) { while (a[i] < pivot) i++; while (a[j] > pivot) j--; if (i <= j) { a.swap(i,j); // follow pivot if it is swapped if (p == i) p = j; else if (p == j) p = i; i++, j--; } } a.unwatch_all(); if (lo < j) QuickSortLR(a, lo, j); if (i < hi) QuickSortLR(a, i, hi); }
void QuickSortLR(SortArray& A) { return QuickSortLR(A, 0, A.size()-1); }
void QuickSortLR(WSortView& a) { return QuickSortLR(a, 0, a.size()-1); }