堆排序代码
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* sortedSquares(int* A, int ASize, int* returnSize){
int bucket[10001];
memset(bucket, 0, sizeof(int)*10001);
for(int i=0;i<ASize;i++)
{
if(A[i]<0) A[i] = -1 * A[i];
bucket[A[i]]++;
}
int *answer, count = 0;
answer = (int*)malloc(sizeof(int) * ASize);
for(int i=0;i<10001;i++)
{
if(bucket[i]>0)
{
while(bucket[i]!=0)
{
answer[count] = i * i;
bucket[i]--; count++;
}
}
}
*returnSize = ASize;
return answer;
}
基本思路
先将数组中负数转化为正数,进行桶排序,输出其平方。
遇到的问题
- 一开始手滑,bucket[i]和i没分清楚导致数组越界
- 忘记将bucket数组初始化,导致over-heat-flow
- 实验课的时候也出现了这两个错误==真是憨憨
内存消耗击败100% 耗时只击败了59.77% 看评论好像快速排序比较快一些,或者分情况讨论,可以用到数组是升序这一条件。
双指针代码
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* sortedSquares(int* A, int ASize, int* returnSize){
*returnSize = ASize;
int pre = -1, p = 0, count = 0;
for(int i=1;i<ASize;i++)
{
if(A[i]>=0&&A[i-1]<0)
{
pre = i - 1;
p = i;
}
}
int *answer = (int*)malloc(sizeof(int) * ASize);
if(p!=0||A[0]>=0)
{
while(pre>-1&&p<ASize)
{
if(A[pre]*A[pre]>A[p]*A[p])
{
answer[count] = A[p]*A[p];
count++; p++;
}
else
{
answer[count] = A[pre]*A[pre];
count++; pre--;
}
}
while(pre>-1)
{
answer[count] = A[pre]*A[pre];
count++; pre--;
}
while(p<ASize)
{
answer[count] = A[p]*A[p];
count++; p++;
}
}
else
{
for(int i=ASize-1;i>=0;i--)
{
answer[count] = A[i]*A[i];
count++;
}
}
return answer;
}
基本思路
找到正负分界处,向两端展开,求平方,排序。
遇到的问题
- 分情况讨论,各种情况的条件要弄清晰,一开始分情况的条件有一些错误。
这个更慢38.27%。内存消耗稍少一点点100%。