解决数组排序超时问题

我比较菜,就目前知识面只学到指针初步,目前只学习了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

使用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函数,进行结构数组的排序