void maximizeHeap( int *nums, int idx, int size)
{
int v = nums[idx];
while( 2 * idx + 1 < size)
{
int a = 2 * idx +1;
int b = 2 * idx +2;
if( b < size && nums[b] >nums[a])
{
a = b;
}
if( nums[a] <= v)
{
break;
}
nums[idx] = nums[a];
idx = a;
}
nums[idx] = v;
}
int pop(int *nums, int *queueSize)
{
int ret = nums[0];
int tmp = nums[*queueSize-1 ];
*queueSize -= 1;
int i = 0;
while( 2 * i + 1 < *queueSize)
{
int a =2 *i + 1;
int b = 2 * i + 2;
if( b < *queueSize && nums[b] > nums[a])
{
a = b;
}
if( nums[a] <= tmp)
{
break;
}
nums[i] = nums[a];
i = a;
}
nums[i] = tmp;
return ret;
}
int* sortArray(int* nums, int numsSize){
int i;
for( i = (numsSize)/2 -1; i >= 0; --i)
{
maximizeHeap(nums, i, numsSize);
}
int queueSize = numsSize;
i = 0;
while( i < numsSize)
{
int ret = pop(nums, &queueSize);
nums[numsSize-i -1] = ret;
++i;
}
return nums;
}