void insertion_sort(long long *nums, int size)
{
int i, j;
for(i = 0; i < size -1; ++i)
{
j = i;
long long tmp = nums[j+1];
while( j >= 0 && tmp < nums[j])
{
nums[j+1] = nums[j];
--j;
}
nums[j+1] = tmp;
}
}
void swap(long long *a, long long *b)
{
long long tmp = *a;
*a = *b;
*b = tmp;
}
long long median_of_three(long long *nums, int s, int e)
{
int mid = (e -s)/2 + s;
if(nums[s] > nums[mid])
{
swap(&nums[s], &nums[mid]);
}
if(nums[s] > nums[e])
{
swap(&nums[s], &nums[e]);
}
if(nums[mid] > nums[e])
{
swap(&nums[mid], &nums[e]);
}
swap(&nums[mid], &nums[e-1]);
return nums[e-1];
}
void quick_sort( long long *nums, int s, int e)
{
if(e -s + 1 > 10)
{
long long median = median_of_three(nums, s, e);
int i = s;
int j = e -1;
while(1)
{
while( nums[++i] < median);
while(nums[--j] > median);
if(i < j)
{
swap(&nums[i], &nums[j]);
}
else
{
break;
}
}
swap(&nums[i], &nums[e-1]);
quick_sort(nums, s, i -1);
quick_sort(nums, i + 1, e);
}
else
{
insertion_sort(nums, e-s+1);
}
}