size_t findExtremum (T arr[],
                     size_t arrSize,
                     bool (*pComparator)(T,T)) 
{
    size_t indexMax = 0;
    for (size_t i = 1; i < arrSize; i++)
    {
        if (pComparator (arr[indexMax],arr[i])) 
        {
          indexMax = i;
        }
    }
    return indexMax; 
}
示例#2
0
void merge_sort(T* array, size_t n, T* temp, int (*pComparator)(const T&, const T&, void*),
                void* pUserData)
{
    size_t l1, l2, u1, u2, i;
    size_t size = 1, j, k;

    while (size < n)
    {
        l1 = 0;
        k = 0;
        while (l1 + size < n)
        {
            l2 = l1 + size;
            u1 = l2 - 1;
            u2 = (l2 + size - 1 < n) ? l2 + size - 1 : n - 1;

            for (i = l1, j = l2; i <= u1 && j <= u2; k++)
            {
                if (pComparator(array[i], array[j], pUserData) <= 0)
                    temp[k] = array[i++];
                else
                    temp[k] = array[j++];
            }

            for (; i <= u1; k++)
                temp[k] = array[i++];
            for (; j <= u2; k++)
                temp[k] = array[j++];

            l1 = u2 + 1;
        }

        for (i = l1; k < n; i++)
            temp[k++] = array[i];

        for (i = 0; i < n; i++)
            array[i] = temp[i];

        size *= 2;
    }
}