예제 #1
0
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);
}
예제 #2
0
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);
}
예제 #3
0
void QuickSortLR(SortArray& A)
{
    return QuickSortLR(A, 0, A.size()-1);
}
예제 #4
0
void QuickSortLR(WSortView& a)
{
    return QuickSortLR(a, 0, a.size()-1);
}