编辑代码

#include <stdio.h>
//定义一个结构体,存储分数和小组
typedef struct {
    int score;
    char group;
} Record;

//定义一个交换函数,用于交换两个记录的位置
void swap(Record *a, Record *b) {
    Record temp = *a;
    *a = *b;
    *b = temp;
}

//定义一个划分函数,用于快速排序
int partition(Record arr[], int low, int high) {
    //选取最右边的元素作为基准
    Record pivot = arr[high];
    //定义一个变量i,用于记录比基准小的元素的位置
    int i = low - 1;
    //遍历数组中除了基准外的其他元素
    for (int j = low; j < high; j++) {
        //如果当前元素比基准小或者相等,则将其与i+1位置的元素交换,并将i加一
        if (arr[j].score <= pivot.score) {
            i++;
            swap(&arr[i], &arr[j]);
        }
    }
    //最后将基准与i+1位置的元素交换,并返回i+1作为划分点
    swap(&arr[i + 1], &arr[high]);
    return i + 1;
}

//定义一个快速排序函数,用于对数组进行递归排序
void quick_sort(Record arr[], int low, int high) {
    //如果low小于high,则说明数组中至少有两个元素
    if (low < high) {
        //调用划分函数,得到划分点p
        int p = partition(arr, low, high);
        //对左半部分进行快速排序
        quick_sort(arr, low, p - 1);
        //对右半部分进行快速排序
        quick_sort(arr, p + 1, high);
    }
}

void output(Record arr[], int n) {
    //定义一个变量count,用于记录已经输出的记录数目
    int count = 0;
    //定义一个变量last_group,用于记录上一个输出的小组
    char last_group = '\0';
    //定义一个字符串数组strs,用于存储每个小组的分数
    char strs[3][20] = {"", "", ""};
    
    //从数组末尾开始遍历(因为是升序排列)
    for (int i = n - 1; i >= 0; i--) {
        //如果已经输出了五条记录,则退出循环
        if (count == 5) break;
        
        //将当前记录的分数转换为字符串,并追加到对应小组的字符串中
        char temp[5];
        sprintf(temp, "%d ", arr[i].score);
        strcat(strs[arr[i].group - 'A'], temp);
        
        //将count加一
        count++;
        
		//如果下一条记录与当前记录有相同的分数,并且还没有输出五条记录,则也将下一条记录的分数追加到对应小组的字符串中,并将count加一(注意不要越界)
		if (i > 0 && arr[i - 1].score == arr[i].score && count < 5) {
		    sprintf(temp, "%d ", arr[i - 1].score);
		    strcat(strs[arr[i - 1].group - 'A'], temp);
		    count++;
		}	
	}
	
	//按照你想要的顺序输出字符串数组中的内容
	printf("A: %s\n", strs[0]);
	printf("B: %s\n", strs[1]);
	printf("C: %s\n", strs[2]);
}

//主函数,测试数据和功能是否正确

int main() {

	//初始化三个项目组A、B、C各自10位员工的成绩

	int A[] = {85 ,70 ,74 ,64 ,67 ,89 ,90 ,78 ,99 ,40};
    int B[] = {87 ,72 ,73 ,61 ,92 ,89 ,60 ,68 ,79 ,60};
    int C[] = {55 ,69 ,93 ,80 ,91 ,88 ,72 ,68 ,77 ,58};

    //定义一个数组,用于存储所有员工的记录
    Record arr[30];

    //将三个项目组的成绩和小组分别存入数组中
    for (int i = 0; i < 10; i++) {
        arr[i].score = A[i];
        arr[i].group = 'A';
        arr[i + 10].score = B[i];
        arr[i + 10].group = 'B';
        arr[i + 20].score = C[i];
        arr[i + 20].group = 'C';
    }

    //对数组进行快速排序
    quick_sort(arr, 0, 29);

    //输出前五名的分数和小组
    output(arr, 30);

    return 0;
}