对部门进行排序

题目描述 :
给定一组部门信息存在departsMents , departsMents[i] 表示 cityName 部门所在城市,departName 部门名称, personNum部门人数

  1. 先从每个城市选取人数最多的5个部门作为分析对象,当人数相等时优先选取departName 字典序最小的; 不足5个按实际选;
  2. 然后对选取的结果,按照 cityName departName 逐行输出 首先按cityName 字典升序,同一个·城市,按departName字典升序输出;

解题思路:
定义结构体
部门结构体: 部门名字 部门人数

城市结构包含: 城市名字 部门结构体 部门数目;
step1: 创建临时结构体数组存放选出的城市和部门信息
step2: 对上面结构体 对部门信息按人数 部门名称排;
step3: 申请返回空间 放进去选好的输出形式数据;
step4: 对输出结果先排城市名 再排部门名

#define MAX_LEN 10
#define MAX_NUM 100
typedef struct {
	char departName[MAX_LEN];
	int  personNum;
}DepartInfo;

typedef struct {
	char cityName[MAX_LEN];
	DepartInfo departInfo[MAX_NUM];
	int  departNum;
}CityInfo;

typedef struct {
	char* departName;
	char* cityName;
	int   personNum;
}DepartMnent;

typedef struct {
	char* departName;
	char* cityName;
}DepartOut;

// 对部门人数和部门名称排序
int cmp1(const void* a, const void* b)
{
	DepartOut* pa = (DepartOut*)a;
	DepartOut* pb = (DepartOut*)b;
	if (strcmp(pa->cityName, pb->cityName) == 0) {
		return strcmp(pa->departName, pb->departName);
	}
	return strcmp(pa->cityName, pb->cityName);
}

int cmp2(const void* a, const void* b)
{
	DepartInfo* pa = (DepartInfo*)a;
	DepartInfo* pb = (DepartInfo*)b;
	if (pa->personNum == pb->personNum) {
		return strcmp(pa->departName, pb->departName);
	}
	return pb->personNum - pa->personNum;
}

DepartOut* filter(DepartMnent* departsMents, size_t departsMentsSize, DepartOut* outPut)
{
	CityInfo info2[MAX_NUM];
	for (int i = 0; i < departsMentsSize; i++) {
		info2[i].departNum = 0;
		for (int j = 0; j < MAX_NUM; j++) {
			info2[i].departInfo[j].personNum = 0;
		}
	}

	int cityNum = 0;
	int flag; // 城市标记
	for (int i = 0; i < departsMentsSize; i++) {
		flag = 0;
		//  遍历城市
		for (int j = 0; j < cityNum; j++) {
			if (strcmp(departsMents[i].cityName, info2[j].cityName) == 0) {
				// 1. 添加已经存在城市的部门信息
				strcpy_s(info2[j].departInfo[info2[j].departNum].departName, MAX_LEN, departsMents[i].departName);
				info2[j].departInfo[info2[j].departNum].personNum = departsMents[i].personNum;
				info2[j].departNum += 1;
				flag = 1;
				break;
			}
		}
		// 2. 添加新城市 
		if (flag == 0) {
			strcpy_s(info2[cityNum].cityName, MAX_LEN, departsMents[i].cityName);
			// 添加部门
			strcpy_s(info2[cityNum].departInfo[info2[cityNum].departNum].departName, MAX_LEN, departsMents[i].departName);
			// 部门人数++ 
			info2[cityNum].departInfo[info2[cityNum].departNum].personNum += 1;
			// 部门数++;
			info2[cityNum].departNum += 1;
			cityNum++;
		}
	}

	// 对部门信息按人数排 部门名称排
	for (int i = 0; i < cityNum; i++) {
		qsort(info2[i].departInfo, info2[i].departNum, sizeof(DepartInfo), cmp1);
		if (info2[i].departNum > 5) {
			info2[i].departNum = 5;
		}
	}

	// 将排好序的填进申请空间
	// 返回的形式是城市 和 部门  外层申请大的 内层分别申请城市名字和 部门名字

	DepartOut* departOut = (DepartOut*)malloc(sizeof(DepartOut) * cityNum);
	for (int i = 0; i < cityNum; i++) {
		// 每个城市对应几个部门 再申请部门的空间
		for (int j = 0; j < info2[i].departNum; j++) {
			departOut[i].cityName = (char*)malloc(sizeof(char) * MAX_LEN);
			departOut[i].departName = (char*)malloc(sizeof(char) * MAX_LEN);

			strcpy_s(departOut[i].cityName, MAX_LEN, info2[i].cityName);
			strcpy_s(departOut[i].departName, MAX_LEN, info2[i].departInfo[j].departName);
		}
	}
	// 第二个排序 先排城市名 再排部门
	qsort(departOut, cityNum, sizeof(DepartOut), cmp2);
	return departOut;
}
  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值