#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct Stu{
int no;
char name[40];
int score[3];
}Stu;
void sort(void *base,size_t nmemb,size_t size,int (*compare)(const void *,const void *)){
int i,j;
char *pbase = base;
void *pkey = malloc(size);
for(i=1;i<nmemb;i++){
memcpy(pkey,pbase+i*size,size);
for(j=i-1;j>=0&&compare(pbase+j*size,pkey)>0;--j){
memcpy(pbase+(j+1)*size,pbase+j*size,size);
}
memcpy(pbase+(j+1)*size,pkey,size);
}
free(pkey);
}
int compare(const void *p1,const void *p2){
const int *pn1 = p1;
const int *pn2 = p2;
return *pn1 - *pn2;
}
int comp_stu_by_score(const void *p1,const void *p2){
const Stu *ps1 = p1;
const Stu *ps2 = p2;
return (ps2->score[0]+ps2->score[1]+ps2->score[2]) - (ps1->score[0]+ps1->score[1]+ps1->score[2]);
}
int main(){
int arr[] = {1,5,9,6,7,4,8,3,2,0};
sort(arr,sizeof(arr)/sizeof(arr[0]),sizeof(int),compare);
int i;
for(i=0;i<sizeof(arr)/sizeof(arr[0]);i++){
printf("%d ",arr[i]);
}
printf("\n\n");
Stu stus[] = {
{110,"刘备",{100,80,90}},
{120,"关羽",{90,81,92}},
{130,"张飞",{99,84,88}},
{140,"马超",{70,99,95}},
{150,"赵云",{87,78,93}},
{160,"黄忠",{98,82,98}},
{170,"曹操",{100,100,100}}
};
sort(stus,sizeof(stus)/sizeof(stus[0]),sizeof(Stu),comp_stu_by_score);
for(i=0;i<sizeof(stus)/sizeof(stus[0]);i++){
int sum = stus[i].score[0]+stus[i].score[1]+stus[i].score[2];
printf("%d %s %d %d %d %d\n",stus[i].no,stus[i].name,stus[i].score[0],stus[i].score[1],stus[i].score[2],sum);
}
return 0;
}
