一开始用以前排序用的交换排序?(我也不知道怎么称呼)写了一个版本,结果运行超时了。在论坛里搜索以后才知道要用qsort函数
具体是看了这个:
C语言 —— PAT 【1015. 德才论 (25分)】 (运行超时——快速排序)_小吴同学真棒的博客-CSDN博客
还有这个:
快速排序---(面试碰到过好几次)_nrsc-CSDN博客_快速排序
但我写的时候是学第一个自己写了个qsort函数,但看了其他人的代码发现好像是一个头文件里包含着的标准函数,可以直接使用,那......以后再用用看吧(我真的好笨啊呜呜呜)
qsort函数使用方法总结(详细全面+代码)_嵌入式与Linux那些事的博客-CSDN博客_qsort
#include<stdio.h>
typedef struct{
int number;
int de;
int cai;
}grade;
int cmp(grade stu_i, grade stu_j);
void qsort(grade a[],int low,int high);
void output(grade a[],int cnt);
int main(){
int n,l,h;
scanf("%d%d%d",&n,&l,&h);
grade grades[100000];
grade a[100000];
grade b[100000];
grade c[100000];
grade d[100000];
int cnt=0;
int p=0;
int q=0;
int r=0;
int s=0;
for(int i=0;i<n;i++){
scanf("%d%d%d",&grades[i].number,&grades[i].de,&grades[i].cai);
if(grades[i].de>=l&&grades[i].cai>=l){
cnt++;
if(grades[i].de>=h&&grades[i].cai>=h){
a[p]=grades[i];
p++;
}else if(grades[i].de>=h&&grades[i].cai<h){
b[q]=grades[i];
q++;
}else if(grades[i].de<h&&grades[i].cai<h&&grades[i].de>=grades[i].cai){
c[r]=grades[i];
r++;
}
else{
d[s]=grades[i];
s++;
}
}
}
printf("%d\n",cnt);
qsort(a,0,p-1);
qsort(b,0,q-1);
qsort(c,0,r-1);
qsort(d,0,s-1);
output(a,p);
output(b,q);
output(c,r);
output(d,s);
return 0;
}
int cmp(grade stu_i, grade stu_j)
{
if (stu_i.de + stu_i.cai > stu_j.de + stu_j.cai)
{
return 1;
}
else if ((stu_i.de + stu_i.cai == stu_j.de + stu_j.cai) && stu_i.de > stu_j.de)
{
return 1;
}
else if ((stu_i.de + stu_i.cai == stu_j.de + stu_j.cai) && (stu_i.de == stu_j.de) && stu_i.number < stu_j.number)
{
return 1;
}
return 0;
}
void qsort(grade stus[], int low, int high)
{
int i, j;
grade temp;
if (low < high)
{
i = low, j = high, temp = stus[i];
while (i < j)
{
while (i < j && !cmp(stus[j], temp))
j--;
if (i < j) {
stus[i] = stus[j];
i++;
}
while (i < j && cmp(stus[i], temp))
i++;
if (i < j) {
stus[j] = stus[i];
j--;
}
}
stus[i] = temp;
qsort(stus, low, i - 1);
qsort(stus, i + 1, high);
}
}
void output(grade a[],int cnt)
{
for(int i=0;i<cnt;i++){
printf("%d %d %d\n",a[i].number,a[i].de,a[i].cai);
}
}