本题不难只要会排序方法就可以解决,不理解的结合我排序的文章看
堆排序方法
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
void swap(int*a,int*b)
{
int t =*a;
*a=*b;
*b=t;
}
void adjustDowm(int* nums,int numsSize,int parent)
{
int child = parent * 2 + 1;
while (child < numsSize)
{
if (child + 1 < numsSize && nums[child + 1] > nums[child])
{
++child;
}
if (nums[child] > nums[parent])
{
swap(&nums[child], &nums[parent]);
parent = child;
child = parent * 2 + 1;
}
else
{
break;
}
}
}
void _sortArray(int*nums,int numsSize)
{
for(int i=(numsSize-1-1)/2;i>=0;--i)
{
adjustDowm(nums,numsSize,i);
}
int end=numsSize-1;
while(end>0)
{
swap(&nums[0],&nums[end]);
adjustDowm(nums,end,0);
--end;
}
}
int* sortArray(int* nums, int numsSize, int* returnSize){
*returnSize=numsSize;
//int* nums=(int *)malloc(sizeof(int)*numsSize);
_sortArray(nums,numsSize);
return nums;
}
归并排序
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
void _sortArray(int*nums,int left,int right,int*tmp)
{
//区间只有一个数的时候返回
if (left >= right)
return;
//分解区间
int mid = (right + left) / 2;
_sortArray(nums, left, mid, tmp);
_sortArray(nums, mid + 1, right, tmp);
// 归并
int begin1 = left, end1 = mid;
int begin2 = mid + 1, end2 = right;
int index = left;
//其中一个走完了就结束
while (begin1 <= end1 && begin2 <= end2)
{
if (nums[begin1] < nums[begin2])
{
tmp[index++] = nums[begin1++];
}
else
{
tmp[index++] = nums[begin2++];
}
}
//最后-考虑谁里面还有数据就把它放到tmp中的最后一个数据
while (begin1 <= end1)
{
tmp[index++] = nums[begin1++];
}
while (begin2 <= end2)
{
tmp[index++] = nums[begin2++];
}
// 归并后的结果,拷贝回到原数组
for (int i = left; i <= right; ++i)
{
nums[i] = tmp[i];
}
}
int* sortArray(int* nums, int numsSize, int* returnSize){
*returnSize=numsSize;
int* tmp = (int*)malloc(sizeof(int)*numsSize);
_sortArray(nums,0,numsSize-1,tmp);
return nums;
}