PAT乙级 1015 德才论

本文介绍了作者在解决PAT【1015.德才论】问题时遇到的运行超时问题,通过学习快速排序并使用C语言内置的qsort函数优化了算法。博客详细解释了快速排序的运用,并提供了代码示例,包括如何定义比较函数cmp和自定义快速排序函数qsort。
摘要由CSDN通过智能技术生成

一开始用以前排序用的交换排序?(我也不知道怎么称呼)写了一个版本,结果运行超时了。在论坛里搜索以后才知道要用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);
	}
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值