1015 德才论(c++)qsort()函数

这题主要问题就是运行时间的问题,给的条件太多了导致了代码的循环次数就很多这时候就只能考虑排序算法了,网上看到了qsort()函数,感觉非常的好用啊我先详细将一下我对qsort()函数的理解

void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
使用它要调用<stdlib.h>
它采用的是快速排序的方法,对于快排大家肯定不模式时间复杂度是n*log(n)
其次使用qsort()函数要四个参数
1,void *base  要排序数组的第一个元素指针
2,size_t nitems, 要排序数组元素的个数
3, size_t size ,数组每个元素的大小,可以用sizeof()来获得
4, int (*compar)(const void *, const void*)) 用来比较两个元素的函数
这个函数是返回整型,
如果compar返回值小于0(< 0),那么p1所指向元素会被排在p2所指向元素的前面
如果compar返回值等于0(= 0),那么p1所指向元素与p2所指向元素的顺序不确定
如果compar返回值大于0(> 0),那么p1所指向元素会被排在p2所指向元素的后面
#include<stdio.h>
#include <stdlib.h>
#include <iostream>
#include<string>
#include<math.h>
using namespace std;
typedef struct student {
	int SN;
	int moral;
	int talent;
	int flag=0;
	int sum;
}st;
int ss(const void* a, const void* b) {
	st *pa = (st*)a;
	st *pb = (st*)b;
	if (pa->flag < pb->flag) {
		return -1;//flag小的在前面
	}
	else if (pa->flag == pb->flag && pa->sum > pb->sum) {
		return -1;//flag相同时总分大的在前面
	}
	else if (pa->flag == pb->flag && pa->sum == pb->sum && pa->moral > pb->moral) {
		return -1;//flag相同时总分相同德分大的在前面
	}
	else if (pa->flag == pb->flag && pa->sum == pb->sum && pa->moral == pb->moral&&pa->SN<pb->SN) {
		return -1;
	}
	else {
		return 1;
	}
}
int main() {
	int a, l, h;
	int no = 0;
	cin >> a >> l >> h;
	st* xue = new st[a];
	for (int i = 0;i < a;i++) {
		cin >> xue[i].SN >> xue[i].moral >> xue[i].talent;
		xue[i].sum = xue[i].moral + xue[i].talent;
		if (xue[i].moral >= h && xue[i].talent >= h) {
			xue[i].flag = 1;
		}
		else if (xue[i].moral >= h&&xue[i].talent>=l) {
			xue[i].flag = 2;
		}
		else if (xue[i].moral >= l && xue[i].talent >= l&&xue[i].moral>=xue[i].talent) {
			xue[i].flag = 3;
		}
		else if (xue[i].moral >= l && xue[i].talent >= l) {
			xue[i].flag = 4;
		}else {
			xue[i].flag = 5;
			no++;
		}
	}
	qsort(xue, a, sizeof(st), ss);
	cout << a - no << endl;
	for (int i = 0;i < a - no;i++) {
		cout << xue[i].SN << " " << xue[i].moral << " " << xue[i].talent << endl;
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值