You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用C语言快速排序实现学生按年龄+姓名多条件排序?

多条件快速排序实现方案

首先修正你代码里的两处笔误:

  • struct stduent 拼写错误,应为 struct student
  • int 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;
}

关键修改说明

  1. 引入头文件:添加<string.h>,因为需要用strcmp函数比较字符串字典序(strcmp(a,b)返回负数表示a字典序小于b,0表示相等,正数表示a大于b)。
  2. 基准元素存储:原来只存基准的年龄,现在改为存储整个student结构体,方便同时比较姓名。
  3. 多条件判断逻辑:
    • 当当前元素年龄小于基准年龄:直接交换到左侧,满足升序要求。
    • 当当前元素年龄等于基准年龄:再通过strcmp比较姓名,只要当前姓名字典序小于等于基准姓名,就交换到左侧,保证年龄相同时姓名按字典序排列。
  4. 保持快速排序结构:递归部分和原代码完全一致,只修改了核心的比较规则,不影响快速排序的时间复杂度。

内容的提问来源于stack exchange,提问作者penguinn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 14:01:15