总结:
当函数指针作为函数的参数时,要注意函数原型需要相同,否则会发生未知的错误。
尽量使用标准库函数。
当需要排序时,能先分类就先分类。能大大减少所使用的资源
#include<stdio.h>
#include<stdlib.h>
unsigned int H, L;
typedef struct Info
{
unsigned int Number;
unsigned int de;
unsigned int cai;
}tInfo;
int compare(const void * p, const void * q)
{
tInfo *x = p, *y = q;
if ((x->cai + x->de) != (y->cai + y->de))
{
if ((x->cai + x->de) > (y->cai + y->de))
return -1;
}
else if (x->de != y->de)
{
if (x->de > y->de)
{
return -1;
}
}
else
{
if (x->Number < y->Number)
return -1;
}
return 1;
}
int main(void)
{
int N=0, M=0,i=0,M1=0,M2=0,M3=0,M4=0;
tInfo Val1[10000], Val2[10000], Val3[10000], Val4[10000], temp;
//read
scanf("%d%d%d", &N, &L, &H);
for (i = 0; i < N; i++)
{
scanf("%d%d%d", &temp.Number, &temp.de, &temp.cai);
if (temp.de >= L && temp.cai >= L)
{
M++;
if (temp.de >= H && temp.cai >= H)
{
M1++;
Val1[M1 - 1] = temp;
}
else if (temp.de >= H)
{
M2++;
Val2[M2 - 1] = temp;
}
else if (temp.cai <= temp.de)
{
M3++;
Val3[M3 - 1] = temp;
}
else
{
M4++;
Val4[M4 - 1] = temp;
}
}
}
printf("%d\n", M);
qsort(Val1, M1, sizeof(tInfo),compare);
for (i = 0; i < M1; i++)
{
printf("%d %d %d\n",Val1[i].Number, Val1[i].de, Val1[i].cai);
}
qsort(Val2, M2, sizeof(tInfo), compare);
for (i = 0; i < M2; i++)
{
printf("%d %d %d\n", Val2[i].Number, Val2[i].de, Val2[i].cai);
}
qsort(Val3, M3, sizeof(tInfo), compare);
for (i = 0; i < M3; i++)
{
printf("%d %d %d\n", Val3[i].Number, Val3[i].de, Val3[i].cai);
}
qsort(Val4, M4, sizeof(tInfo), compare);
for (i = 0; i < M4; i++)
{
printf("%d %d %d\n", Val4[i].Number, Val4[i].de, Val4[i].cai);
}
}