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; }
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; } }