Assuming you have an insertion sort routine, try this modification to your code:
void q_sort(int numbers[], int left, int right)
{
int pivot, l_hold, r_hold;
// If there are few records left to look at, use an insertion sort
// because it is faster.
if ((right - left) < INSERTION_SORT_THRESHOLD)
{
InsertionSort( numbers, left, right );
return;
}
l_hold = left;
r_hold = right;
. . .
and then just tinker with INSERTION_SORT_THRESHOLD's value to see what happens. For example, make it zero to disable the insertion sort, make it huge to ONLY do an insertion sort, and then try something like 5 or 10.
On Windows, you can use GetTickCount() to return the time since boot in miliseconds (mod 32 bits), and that can make for a simple elapsed time counter:
void quickSort(int numbers[], int array_size)
{
DWORD startTime = GetTickCount();
q_sort(numbers, 0, array_size - 1);
printf( "Elapsed time:%d ms\n", GetTickCount() - startTime );
}
This isn't perfect for production code because the tick count will flip over eventually, but for your testing on where to put the insertion sort threshold this should do fine.