Caaaaaan 2021-12-20 21:14 采纳率: 100%
浏览 54
已结题

解决数组排序超时问题

我比较菜,就目前知识面只学到指针初步,目前只学习了C语言,还不会c++
很多算法也没有接触,希望能够得到我这个知识层面,能够解决这个表示问题

#include<stdio.h>
struct infor{
    int number;
    int science,mind;
    int total;
};
int sort(struct infor ch[],int kin){//kin是该数组的上限
    struct infor temp; 
    int i,j,index;
    for(i=0;i<kin-1;i++){
        index=i;
        for(j=i+1;j<kin;j++){
            if(ch[j].total>ch[index].total){
                index=j;
            }
            if(ch[j].total==ch[index].total){
                if(ch[j].mind>ch[index].mind){
                    index=j;
                }
                if(ch[j].mind==ch[index].mind){
                    if(ch[j].number<ch[index].number){
                        index=j;
                    }
                }
            }
        }
        temp=ch[index];
        ch[index]=ch[i];
        ch[i]=temp;
    }
} 
int main(){
    int i,n,min,max,j=0,k=0,k1=0,k2=0,k3=0;
    scanf("%d %d %d",&n,&min,&max);
    struct infor in[n],temp,ms[n];//in是及格学生信息,共i个人;ms是才德双全,共k个人; 
    struct infor sm[n],mm[n],ss[n];//sm是德胜才,共k1个;mm是德才皆无,但德>才,k2 ;ss是才胜德,k3 
    for(i=0;j<n;i++,j++){
        scanf("%d %d %d",&in[i].number,&in[i].mind,&in[i].science);
        in[i].total=in[i].science+in[i].mind;
        if(in[i].science<min||in[i].mind<min){
            i--;
        } 
    }//i就已经是及格个数了,没有及格的进行覆盖;
    for(j=0;j<i;j++){
        if(in[j].science>=max&&in[j].mind>=max){
            ms[k]=in[j];
            k++;
        }
        if(in[j].mind>=max&&in[j].science<max){
            sm[k1]=in[j];
            k1++;
        }
        if(in[j].mind<max&&in[j].science<max){
            if(in[j].mind>=in[j].science){
                mm[k2]=in[j];
                k2++;
            }
        }
        if(in[j].mind<max&&in[j].science<max){
            if(in[j].mind<in[j].science){
                ss[k3]=in[j];
                k3++;
            }
        }
        if(in[j].mind<max&&in[j].science>=max){
            ss[k3]=in[j];
            k3++;
        }
    }
    printf("%d\n",i); 
    sort(ms,k);
    sort(sm,k1);
    sort(mm,k2);
    sort(ss,k3);
    for(j=0;j<k;j++){
        printf("%d %d %d\n",ms[j].number,ms[j].mind,ms[j].science);
    }
    for(j=0;j<k1;j++){
        printf("%d %d %d\n",sm[j].number,sm[j].mind,sm[j].science);
    }
    for(j=0;j<k2;j++){
        printf("%d %d %d\n",mm[j].number,mm[j].mind,mm[j].science);
    }
    for(j=0;j<k3;j++){
        printf("%d %d %d\n",ss[j].number,ss[j].mind,ss[j].science);
    }
}//录入完成,现在要写一个sort函数,进行结构数组的排序 

img

img

img

img

img

img

  • 写回答

1条回答 默认 最新

  • 技术专家团-Bamboo 2021-12-21 11:17
    关注

    使用c语言stdlib.h中的快速排序函数qsort()

    #include<stdio.h>
    #include<stdlib.h>
    struct infor {
        int number;
        int science, mind;
        int total;
    };
    int cmp(const void *a, const void *b) {
        struct infor *aa = (struct infor *)a;
        struct infor *bb = (struct infor *)b;
        if((aa->total) != (bb->total))
            return ((aa->total) < (bb->total)) ? 1 : -1;
        else if((aa->science) != (bb->science))
            return ((aa->science) > (bb->science)) ? 1 : -1;
        else
            return ((aa->number) > (bb->number)) ? 1 : -1;
    }
    
    int main() {
        int i, n, min, max, j = 0, k = 0, k1 = 0, k2 = 0, k3 = 0;
        scanf("%d %d %d", &n, &min, &max);
        struct infor in[n], temp, ms[n]; //in是及格学生信息,共i个人;ms是才德双全,共k个人;
        struct infor sm[n], mm[n], ss[n]; //sm是德胜才,共k1个;mm是德才皆无,但德>才,k2 ;ss是才胜德,k3
        for(i = 0; j < n; i++, j++) {
            scanf("%d %d %d", &in[i].number, &in[i].mind, &in[i].science);
            in[i].total = in[i].science + in[i].mind;
            if(in[i].science < min || in[i].mind < min) {
                i--;
            }
        }//i就已经是及格个数了,没有及格的进行覆盖;
    
        printf("%d\n", i);
        for(j = 0; j < i; j++) {
            if(in[j].science >= max && in[j].mind >= max) {
                ms[k] = in[j];
                k++;
            }
            if(in[j].mind >= max && in[j].science < max) {
                sm[k1] = in[j];
                k1++;
            }
            if(in[j].mind < max && in[j].science < max) {
                if(in[j].mind >= in[j].science) {
                    mm[k2] = in[j];
                    k2++;
                }
            }
            if(in[j].mind < max && in[j].science < max) {
                if(in[j].mind < in[j].science) {
                    ss[k3] = in[j];
                    k3++;
                }
            }
            if(in[j].mind < max && in[j].science >= max) {
                ss[k3] = in[j];
                k3++;
            }
        }
        qsort(ms, k, sizeof(ms[0]), cmp);
        qsort(sm, k1, sizeof(sm[0]), cmp);
        qsort(mm, k2, sizeof(mm[0]), cmp);
        qsort(ss, k3, sizeof(ss[0]), cmp);
    
        for(j = 0; j < k; j++) {
            printf("%d %d %d\n", ms[j].number, ms[j].mind, ms[j].science);
        }
        for(j = 0; j < k1; j++) {
            printf("%d %d %d\n", sm[j].number, sm[j].mind, sm[j].science);
        }
        for(j = 0; j < k2; j++) {
            printf("%d %d %d\n", mm[j].number, mm[j].mind, mm[j].science);
        }
        for(j = 0; j < k3; j++) {
            printf("%d %d %d\n", ss[j].number, ss[j].mind, ss[j].science);
        }
    }//录入完成,现在要写一个sort函数,进行结构数组的排序
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月30日
  • 已采纳回答 12月22日
  • 创建了问题 12月20日

悬赏问题

  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私