user-0 提问: 请教：结构体数组的元素可以排序吗？

回复:
user: user-1
content: 既然定义了结构体数组 我的想法是这样的 对stu_info这个结构体内的元素 data[i].marks比较大小 然后根据下标来改变整个数组的顺序 其他的就和一般的排序算法没区别了 注意 marks是float型的

user: user-2
content: 使用qsort系统函数即可。 首先定义自己的比较函数，例如： int cmp(void* a ,void *b) {     return (((stu_info* )a)->marks - ((stu_info *)b)->marks); } 然后调用qsort，调用过后数组data中的数组元素已经排好序了。 qsort(data ,MAX ,sizeof(stu_info) ,cmp);  // data:要处理的数组首地址；MAX:要处理的数组元素个数;sizeof(stu_info):数组单个元素大小;cmp:比较函数

user: user-3
content: 你只需要定义规则  不申请额外空间的原地排序就是交换位置而已

user: user-4
content: 利用库函数qsort，对指针排序： int comparefloat(float a,float b) {     if(a == b)return 0;     if(a > b )return 1;     return -1;      }  int cmpByPtr(const void* arg1,const void *arg2) {         return comparefloat( (*( struct stu_info **)arg1)->marks,                     (*( struct stu_info **)arg2)->marks); } // 比较指针 int main(){ struct stu_info *pInfo[MAX]; for(int i=0;i<MAX;i++)pInfo[i] =data +i; ........ qsort(pInfo,MAX,sizeof(struct stu_info *),cmpByPtr); .......    for(i = 0; i < cnt; i++)           printf("%s: %d\n", pInfo[i]->name, pInfo[i]->marks);    rturn 0; } 利用库函数qsort，对数据排序：  ..... int comparefloat(float a,float b) {     if(a == b)return 0;     if(a > b )return 1;     return -1;      }  int cmpByData(const void* arg1,const void *arg2) {         return comparefloat( (( struct stu_info *)arg1)->marks,                     (( struct stu_info *)arg2))->marks ); }  // 比较数据 int main(){  ........ qsort(data,MAX,sizeof(struct stu_info *),cmpByData); .......    for(i = 0; i < cnt; i++)           printf("%s: %d\n", data[i]->name, data[i]->marks);    rturn 0; }   PS： 如果需要自己学排序，仿此。

user: user-5
content: 引用 楼主 mcmay 的回复:请问可以将结构体数组的元素加以排序？例如，我想将学生信息按照期末考试卷面成绩进行排序。先定义以下结构体并声明该结构体的数组，  #include <stdio.h>  #define LEN 21 #define MAX 10  struct stu_info {     char name[LEN];     float marks; };  int main(void) {     struct stu_info data[MAX];     int cnt = 0,i,j;     //假如学生的信息已经都输入好了，接下来应该如何根据学生的分数对数组元素进行从大到小的排序呢？     puts("\nInput students' names (press Enter at the beginning of a line to stop)");     while(cnt < MAX && gets(data[cnt].name) != NULL && data[cnt].name[0] != '\0')    {        printf("Enter students' marks: ");        scanf("%d", &data[i].marks);        cnt++;    }      // 请告知如何排序     // ......     //排序之后打印结果      if(cnt != 0)      {        puts("\nStudents' info in the order of their marks:");        for(i = 0; i < cnt; i++)           printf("%s: %d\n", data[i].name, data[i].marks);      }      else         puts("\nNo data input.");      puts("\nBye!");          return 0;  }  我自己试过用指针，但达不到效果。请问应该如何实现？谢谢！ 当然可以了 参考我写的程序 不懂再问  #include <stdio.h> #include <stdlib.h>  //【样例输入】 //4 //3 22 21 //3 21 22 //3 22 22 //3 21 21 //【样例输出】 //3 21 21 //3 21 22 //3 22 21 //3 22 22 #define MAX_SIZE 1024 struct get_time{     int  Hour;     int  Minute;     int  Second; };  void deal(struct get_time  *elem,int size) {   struct get_time tmp;       int i, j;     for (i = 0; i < size; i++) {     for (j = size - 1; j > i; j--) {          if (elem[j].Hour < elem[j-1].Hour ||elem[j].Minute < elem[j-1].Minute||elem[j].Second < elem[j-1].Second ) {             tmp = elem[j-1];                 elem[j-1] =  elem[j];                 elem[j] = tmp;                         }             }         } }  int main() {     struct get_time answer[MAX_SIZE];     int i;     int num;     scanf("%d",&num);     for(i = 0 ; i < num ; i++)     {      scanf("%d %d %d",&answer[i].Hour,&answer[i].Minute,&answer[i].Second);     }     printf("\n");     deal(answer,num);      for(i = 0 ; i < num ; i++)      printf("%d %d %d\n",answer[i].Hour,answer[i].Minute,answer[i].Second);     return 0; }