如何用C语言快速排序实现学生按年龄+姓名多条件排序?
多条件快速排序实现方案
首先修正你代码里的两处笔误:
struct stduent拼写错误,应为struct studentint pivot = data[right].age.末尾应为分号而非点
核心修改点在于比较逻辑的扩展:快速排序的核心是partition函数里的元素比较规则,我们需要把原来单一的年龄比较,扩展为「先比年龄,年龄相等再比姓名字典序」的多条件判断。
修改后的完整代码
#include <string.h> // 需要引入strcmp函数的头文件 struct student{ char name[1001]; int age; }; void sort(struct student data[], int left, int right){ if(left < right){ int pivot = partition(data, left, right); sort(data, left, pivot - 1); sort(data, pivot + 1, right); } return; } int partition(struct student data[], int left, int right){ // 不再单独存年龄pivot,直接用基准元素(最右侧)的完整信息 struct student pivot_stu = data[right]; int i = left; struct student temp; for(int j = left; j < right; j++){ // 多条件判断:年龄更小,或者年龄相等但姓名字典序更小/相等 if(data[j].age < pivot_stu.age || (data[j].age == pivot_stu.age && strcmp(data[j].name, pivot_stu.name) <= 0)){ temp = data[i]; data[i] = data[j]; data[j] = temp; i++; } } // 把基准元素放到正确的位置 temp = data[i]; data[i] = data[right]; data[right] = temp; return i; }
关键修改说明
- 引入头文件:添加
<string.h>,因为需要用strcmp函数比较字符串字典序(strcmp(a,b)返回负数表示a字典序小于b,0表示相等,正数表示a大于b)。 - 基准元素存储:原来只存基准的年龄,现在改为存储整个
student结构体,方便同时比较姓名。 - 多条件判断逻辑:
- 当当前元素年龄小于基准年龄:直接交换到左侧,满足升序要求。
- 当当前元素年龄等于基准年龄:再通过
strcmp比较姓名,只要当前姓名字典序小于等于基准姓名,就交换到左侧,保证年龄相同时姓名按字典序排列。
- 保持快速排序结构:递归部分和原代码完全一致,只修改了核心的比较规则,不影响快速排序的时间复杂度。
内容的提问来源于stack exchange,提问作者penguinn
相关产品推荐
相关产品推荐

