Listing 2: Implementation of qsortVT and qsortPT


// Listing 2: qsortT.cpp
#include <assert.h>
template<class T> void qsortVT(T *data, const int num)
{
#define SMALLEST_PARTITION 15
    register int i, j;
    int first,
        last,
        stack_pointer;
    T temp;
    struct
    {
        int left,
            right;
    } stack[100];

    if (num <= 0)
        return;
    stack_pointer = 0;
    stack[0].left = 0;
    stack[0].right = num-1;
    while (stack_pointer >= 0)
    {
        first = stack[stack_pointer].left;
        last  = stack[stack_pointer].right;
        assert(first >= 0);
        assert(last >= 0);
        assert(first < num);
        assert(last < num);
        stack_pointer--;

        temp = data[first];
        data[first] = data[(last + first) / 2];
        data[(last + first) / 2] = temp;

        i = first + 1;
        j = last;
        while (i <= j)
        {
            while (data[i]==data[first] || data[i]<data[first])
            {
                if (++i > last)
                    break;
            }
            while (! (data[j] < data[first]))
            {
                if (--j <= first)
                    break;
            }
            if (j > i)
            {
                temp = data[i];
                data[i] = data[j];
                data[j] = temp;
            }
        }

        temp = data[first];
        data[first] = data[j];
        data[j] = temp;

        if ((j - first) >= SMALLEST_PARTITION)
        {
            stack[++stack_pointer].left = first;
            stack[stack_pointer].right = j - 1;
        }
        if ((last - j) >= SMALLEST_PARTITION)
        {
            stack[++stack_pointer].left = j + 1;
            stack[stack_pointer].right = last;
        }
    }

    for (i = 1; i < num; i++)
    {
        temp = data[i];
        j = i - 1;
        while (j >= 0)
        {
            if ( (! (data[j] == temp)) && (! (data[j] < temp)))
            {
                data[j+1] = data[j];
                j--;
            }
            else
                break;
        }
        data[j+1] = temp;
    }
}

template<class T> void qsortPT(T **data, const int num)
{
#define SMALLEST_PARTITION 15
    register int i, j;
    int first,
        last,
        stack_pointer;
    T *temp;
    struct
    {
        int left,
            right;
    } stack[100];

    if (num <= 0)
        return;
    stack_pointer = 0;
    stack[0].left = 0;
    stack[0].right = num-1;

    while (stack_pointer >= 0)
    {
        first = stack[stack_pointer].left;
        last  = stack[stack_pointer].right;
        assert(first >= 0);
        assert(last >= 0);
        assert(first < num);
        assert(last < num);
        stack_pointer--;

        temp = data[first];
        data[first] = data[(last + first) / 2];
        data[(last + first) / 2] = temp;

        i = first + 1;
        j = last;
        while (i <= j)
        {
            while (*data[i]==*data[first]||*data[i]<*data[first])
            {
                if (++i > last)
                    break;
            }
            while (! (*data[j] < *data[first]))
            {
                if (--j <= first)
                    break;
            }
            if (j > i)
            {
                temp = data[i];
                data[i] = data[j];
                data[j] = temp;
            }
        }

        temp = data[first];
        data[first] = data[j];
        data[j] = temp;

        if ((j - first) >= SMALLEST_PARTITION)
        {
            stack[++stack_pointer].left = first;
            stack[stack_pointer].right = j - 1;
        }
        if ((last - j) >= SMALLEST_PARTITION)
        {
            stack[++stack_pointer].left = j + 1;
            stack[stack_pointer].right = last;
        }
    }

    for (i = 1; i < num; i++)
    {
        temp = data[i];
        j = i - 1;
        while (j >= 0)
        {
            if ( (! (*data[j]==*temp)) && (! (*data[j]<*temp)))
            {
                data[j+1] = data[j];
                j--;
            }
            else
                break;
        }
        data[j+1] = temp;
    }
}

// End of Listing 2